|
楼主 |
发表于 2007-4-23 21:00:11
|
显示全部楼层
这是我的server.c端
- #include<stdio.h>
- #include<sys/types.h>
- #include<fcntl.h>
- #include<string.h>
- #include<stdlib.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<arpa/inet.h>
- #include<netdb.h>
- int port = 12345;
- int main()
- {
- struct sockaddr_in sin;
- struct sockaddr_in pin;
- int socknum;
- int add, fd;
- int connfd;
- char buf[1204];
- char checkresult[3];
- int i, len;
- socknum = socket(AF_INET, SOCK_STREAM, 0);
- if (socknum == -1)
- {
- printf("call to socket\n");
- exit(1);
- }
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = INADDR_ANY;
- sin.sin_port = htons(port);
- if (bind(socknum, (struct sockaddr*)&sin, sizeof(sin)) == -1)
- {
- printf("call to bind\n");
- exit(1);
- }
- if (listen(socknum, 20) == -1)
- {
- printf("listen error\n");
- exit(1);
- }
- printf("accetping to \n");
- while (1)
- {
- connfd = accept(socknum, (struct sockaddr*)&pin, &add);
- if (connfd == -1)
- {
- printf("call to accept\n");
- exit(1);
- }
- if (recv(connfd, buf, 1024, 0) == -1)
- {
- printf("call to recv\n");
- exit(1);
- }
- printf("buf = %s\n", buf);
- strcpy(checkresult, "ok");
- printf("yes\n");
- if ((i = send(connfd, checkresult, strlen(checkresult), 0)) < 1)
- {
- printf("send error\n");
- exit(1);
- }
- fd = open("recv", O_RDWR|O_CREAT, 0644);
- if (fd < 0)
- {
- printf("open error\n");
- exit(1);
- }
- while ((i = recv(connfd, buf, 100, 0)) > 0)
- {
- write(fd, buf, i);
- }
- strcpy(checkresult, "no");
- if ((i = send(connfd, checkresult, strlen(checkresult), 0)) < 1)
- {
- printf("send error 2\n");
- exit(1);
- }
- printf("send ok\n");
- close(connfd);
- }
- return 0;
- }
-
复制代码
这是我的client.c端
- #include<stdlib.h>
- #include<fcntl.h>
- #include<sys/types.h>
- #include<stdio.h>
- #include<string.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<arpa/inet.h>
- #include<netdb.h>
- int port = 12345;
- char *hostname = "127.0.0.1";
- int main()
- {
- char buf[1024];
- char message[20];
- int fd, i;
- char checkresult[3];
- int socknum;
- struct sockaddr_in pin;
- struct hostent *ser;
- char str[20] = "A default test";
- if ((ser = gethostbyname(hostname)) == 0)
- {
- printf("error get host name\n");
- exit(1);
- }
- memset(&pin, 0, sizeof(pin));
- pin.sin_family = AF_INET;
- pin.sin_addr.s_addr = ((struct in_addr*)(ser->h_addr))->s_addr;
- pin.sin_port = htons(port);
- if ((socknum = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- printf("call to socket\n");
- exit(1);
- }
- if (connect(socknum, (void*)&pin, sizeof(pin)) == -1)
- {
- printf("call to connect\n");
- exit(1);
- }
- if ((fd = open("send", O_RDONLY)) < 0)
- {
- printf("open error\n");
- exit(1);
- }
-
- printf("send \n");
- if (send(socknum, str, strlen(str), 0) == -1)
- {
- printf("send error\n");
- exit(1);
- }
- memset(checkresult, 0, 3);
- if (recv(socknum, checkresult, 3, 0) == -1)
- {
- printf("recv check error\n");
- exit(1);
- }
- strcpy(buf, "helloworld");
- printf("check = %s\n", checkresult);
- memset(buf, 0, sizeof(buf));
- while ((i = read(fd, buf, 100)) > 0)
- {
- send(socknum, buf, i, 0);
- }
- memset(checkresult, 0, 3);
- if (recv(socknum, checkresult, 3, 0) == -1)
- {
- printf("recv error 2\n");
- exit(1);
- }
- printf("checkresult = %s\n", checkresult);
- close(socknum);
- return 0;
- }
-
复制代码
问题就出在那个while()循环的地方,如果我不是用while()循环,而是只发送一个字符串,那么没问题,但是我使用while()的方法发送了一个文件,然后就出错了,最后server端的send函数已经成功执行,但是client端的recv()函数却始终接收不到数据而一直阻塞在那个地方!
望高手们给点帮助, 非常感谢! |
|