- 论坛徽章:
- 0
|
服务器server.c源代码如下:
- #include <stdio.h>;
- #include <stdlib.h>;
- #include <errno.h>;
- #include <string.h>;
- #include <sys/types.h>;
- #include <netinet/in.h>;
- #include <sys/socket.h>;
- #include <sys/wait.h>;
- #define MYPORT 3490
- #define BACKLOG 50
- main()
- {
- int sockfd, new_fd;
- struct sockaddr_in my_addr;
- struct sockaddr_in their_addr;
- int sin_size;
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket");
- exit(1);
- }
- my_addr.sin_family = AF_INET;
- my_addr.sin_port = htons(MYPORT);
- my_addr.sin_addr.s_addr = INADDR_ANY;
- bzero(&(my_addr.sin_zero),8);
- if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))== -1)
- {
- perror("bind");
- exit(1);
- }
- if (listen(sockfd, BACKLOG) == -1)
- {
- perror("listen");
- exit(1);
- }
- while(1)
- {
- sin_size = sizeof(struct sockaddr_in);
- if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1)
- {
- perror("accept");
- continue;
- }
- printf("server: got connection from %s\n", inet_ntoa(their_addr.sin_addr));
- if (!fork())
- {
- int numbytes=0,mycount=0;
- char *buf[50];
- if (send(new_fd, "Hello, world!\n", 14, 0) == -1)
- perror("send");
- while (1)
- {
- bzero(buf,sizeof(buf));
- if ((numbytes=recv(new_fd, buf, 50, 0)) == -1)
- perror("recv");
- mycount++;
- buf[numbytes]='\0';
- printf("%s\n",buf);
- break;
- }
- close(new_fd);
- exit(0);
- }
- close(new_fd);
- while(waitpid(-1,NULL,WNOHANG) >; 0);
- }
- }
复制代码
客户端client.c的源代码如下:
- #include <stdio.h>;
- #include <stdlib.h>;
- #include <errno.h>;
- #include <string.h>;
- #include <sys/types.h>;
- #include <netinet/in.h>;
- #include <sys/socket.h>;
- #include <sys/wait.h>;
- #define PORT 3490
- #define MAXDATASIZE 102400
- int main(int argc, char *argv[])
- {
- int sockfd, numbytes,i;
- char buf[MAXDATASIZE];
- struct sockaddr_in their_addr;
- if (argc != 2)
- {
- fprintf(stderr,"usage: client hostname\n");
- exit(1);
- }
- if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
- {
- perror("socket");
- exit(1);
- }
- their_addr.sin_family = AF_INET;
- their_addr.sin_port = htons(PORT);
- their_addr.sin_addr.s_addr=inet_addr(argv[1]);
- bzero(&(their_addr.sin_zero),8);
- if (connect(sockfd, (struct sockaddr *)&their_addr,sizeof(struct sockaddr)) == -1)
- {
- perror("connect");
- exit(1);
- }
- char *msg="register fxdlxf 053124 fxdfbl@sohu.com";
- send (sockfd,msg,strlen(msg),0);
- if ((numbytes=recv(sockfd, buf, MAXDATASIZE, 0)) == -1)
- {
- perror("recv");
- exit(1);
- }
- buf[numbytes] = '\0';
- printf("Received: %s",buf);
- close(sockfd);
- return 0;
- }
复制代码
编译得到server和client执行文件后,我先用./server &运行 服务器程序,然后再用./client 127.0.0.1运行客户端程序,发现有时候得到的结果不尽相同!
下面是运行的结果 :
- root@fxdlxf:/home/fxdlxf/private/uptu_p2p# ./client 127.0.0.1
- server: got connection from 127.0.0.1
- register fxdlxf 053124 fxdfbl@sohu.com
- Received: Hello, world!
- root@fxdlxf:/home/fxdlxf/private/uptu_p2p# ./client 127.0.0.1
- server: got connection from 127.0.0.1
- register fxdlxf 053124 fxdfbl@sohu.com
- Received: Hello, world!
- root@fxdlxf:/home/fxdlxf/private/uptu_p2p# ./client 127.0.0.1
- server: got connection from 127.0.0.1
- Received: Hello, world!
- register fxdlxf 053124 fxdfbl@sohu.com
- root@fxdlxf:/home/fxdlxf/private/uptu_p2p#
复制代码
根据程序的流程,应该结果会是:
root@fxdlxf:/home/fxdlxf/private/uptu_p2p# ./client 127.0.0.1
server: got connection from 127.0.0.1
register fxdlxf 053124 fxdfbl@sohu.com
Received: Hello, world!
才对,可有时候会变成:
server: got connection from 127.0.0.1
Received: Hello, world!
register fxdlxf 053124 fxdfbl@sohu.com
两个是在同一机上同一目录下在的,大家说说是什么原因呢?
是与TCP有关?还是与SHELL进程有关?或是我的代码有问题?
感谢! |
|