- 论坛徽章:
- 0
|
本帖最后由 goodstudy_linux 于 2011-11-01 22:03 编辑
编写完网络收发数据代码后,测试中出现了一些问题,调试了很久还是没有解决。
请高手指导,谢谢!
问题如下:
1、客服端能循环发送数据;
2、服务端也能循环接收数据;
3、当客服端先退出时:服务端仍然在不停地接收无数据的信息;
4、如果服务端先退出时,则出现另一个问题:当再次启动服务端和客服端时,出现无法连接的情况;
我原以为只是服务端的while语句放错了位置,但是当我把while语句放到accept函数之前,则服务端无法循环接收数据。
代码如下:
客服端代码
#include <stdio.h>
#include <string.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/types.h>
int main()
{
int my_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in my_serveraddr;
bzero(&my_serveraddr, sizeof(my_serveraddr));
my_serveraddr.sin_family = AF_INET;
my_serveraddr.sin_port = htons(6006);
my_serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");
int con_socket = connect(my_socket, (struct sockaddr*)&my_serveraddr, sizeof(my_serveraddr));
if (con_socket == -1)
{
perror("connect failed: ");
close(my_socket);
return -1;
}
char send_buf[1024];
memset(send_buf, 0, 1024);
while(1)
{
printf("Input your word:\n");
fgets(send_buf, sizeof(send_buf), stdin);
write(my_socket, send_buf, sizeof(send_buf));
}
close(my_socket);
return 0;
}
服务端代码:
#include <stdio.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <netinet/in.h>
int main()
{
int my_socket = socket(AF_INET, SOCK_STREAM, 0);
struct sockaddr_in my_servaddr,my_clitaddr;
socklen_t len;
bzero(&my_servaddr, sizeof(my_servaddr));
my_servaddr.sin_family = AF_INET;
my_servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
my_servaddr.sin_port = htons(6006);
int bindSock = bind(my_socket,(struct sockaddr*)&my_servaddr,sizeof(my_servaddr));
if(bindSock < 0)
{
perror("bind");
return -1;
}
int listenSocket = listen(my_socket, 5);
if(listenSocket < 0)
{
perror("listen");
return -1;
}
len = sizeof(my_clitaddr);
int conn_socket = accept(my_socket, (struct sockaddr*)&my_clitaddr, &len);
if(conn_socket <0 )
{
perror("accept");
return -1;
}
char recv_buf[1024];
while(1)
{
memset(recv_buf, 0, 1024);
printf("The seerver is waiting the information:");
printf("\n=======the recv informations======\n");
int num = read(conn_socket, recv_buf, sizeof(recv_buf));
printf("%s", recv_buf);
}
close(conn_socket);
close(my_socket);
return 0;
} |
|