LinuxC,流式套接字,客户端能连接上服务器端,但是彼此收不到对方发出的数据,解决方法
LinuxC,流式套接字,客户端能连接上服务器端,但是彼此收不到对方发出的数据,急急急!
服务器端代码:
客户端代码:
服务器端代码:
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<pthread.h>
#include<unistd.h>
#include<errno.h>
#include<netdb.h>
#include<string.h>
int main(int argc, char *argv[])
{
int sockfd, new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size, portnumber;
char reply[]="收到数据!";
char recv_buf[1024];
int nbytes;
if(argc != 2)
{
fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
exit(1);
}
if((portnumber = atoi(argv[1])) < 0)
{
fprintf(stderr, "Usage:%s portnumber\a\n", argv[0]);
exit(1);
}
/*服务器端开始建立socket描述符*/
if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == 1)
{
fprintf(stderr, "socket error:%s portnumber\a\n", strerror(errno));
exit(1);
}
/*服务器端填充sockaddr结构*/
bzero(&server_addr, sizeof(struct sockaddr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(portnumber);
/*捆绑sockfd描述符*/
if(bind(sockfd, (struct sockaddr *)(&server_addr), sizeof(struct sockaddr)) == -1)
{
fprintf(stderr, "Bind error:%s\n\a", strerror(errno));
exit(1);
}
/*监听sockfd描述符号*/
if(listen(sockfd, 5) == -1)
{
fprintf(stderr, "Listen error:%s\n\a", strerror(errno));
exit(1);
}
printf("服务器进程已开启...\n");
while(1)
{
/*服务器阻塞,直到客户端程序建立连接*/
sin_size;
if((new_fd = accept(sockfd, (struct sockaddr *)(&client_addr), &sin_size)) == -1)
{
fprintf(stderr, "Accept error:%s\n\a", strerror(errno));
exit(1);
}
printf("Server get connection from %s\n", inet_ntoa(client_addr.sin_addr));
if(nbytes = recv(new_fd, recv_buf, 1024, 0) == -1)
{
fprintf(stderr, "Read Error:%s\n\a", strerror(errno));
exit(1);
}
recv_buf[nbytes] = '\0';
printf("Recvived %s data:%s\n", inet_ntoa(client_addr.sin_addr), recv_buf);
if(send(new_fd, reply, strlen(reply), 0) == -1)
{
fprintf(stderr, "Write Error:%s\n", strerror(errno));
exit(1);
}
//puts(reply);
//printf("%d\n", send_num);
/*这个通信已经结束*/
close(new_fd);
}
close(sockfd);
return EXIT_SUCCESS;
}
客户端代码:
#include <stdio.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<unistd.h>
#include<errno.h>
#include<netdb.h>
#include<string.h>
int main(int argc, char *argv[])
{
int sockfd;
char send_buf[1024], recv_buf[100];