他俩干嘛了?一转身就可以了?
本帖最后由 Horizon2012 于 2011-05-28 10:51 编辑
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<stdlib.h>
- #include<string.h>
- #include<arpa/inet.h>
- #include<unistd.h>
- #define QUENE 10
- #define PORT 3001
- #define BUFSIZE 256
- int main(int argc,char**argv){
- printf("sizeof(struct sockaddr)=%d\n",sizeof(struct sockaddr));
- printf("sizeof(struct sockaddr_in)=%d\n",sizeof(struct sockaddr_in));
- unsigned int addrlen;
- char buf[BUFSIZE];
- int hostfd;
- int clientfd;
- int ret;
- int cnt;
- struct sockaddr_in sock_host;
- struct sockaddr_in sock_client;
- hostfd=socket(AF_INET,SOCK_STREAM,0);
- if(hostfd==-1){
- perror("socket error");
- exit(1);
- }
- sock_host.sin_family=AF_INET;
- sock_host.sin_port=htons(PORT);
- sock_host.sin_addr.s_addr=INADDR_ANY;
- //sock_host.sin_addr.s_addr=inet_addr("127.0.0.1");
- memset(sock_host.sin_zero,0,sizeof(sock_host.sin_zero));
- ret=bind(hostfd,(struct sockaddr*)&sock_host,sizeof(struct sockaddr));
- if(ret==-1){
- perror("bind error");
- exit(1);
- }
- printf("hostfd=%d\n",hostfd);
- ret=listen(hostfd,QUENE);
- if(ret==-1){
- perror("listen error");
- exit(1);
- }
- printf("Wait For the Client Connection.\n");
- while(1){
- printf("hostfd=%d\n",hostfd);
- clientfd=accept(hostfd,(struct sockaddr*)&sock_client,&addrlen);
- if(clientfd==-1){
- perror("accept error");
- continue;
- }
- printf("Client IP:%s\n",inet_ntoa(sock_client.sin_addr));
- memset(buf,0,BUFSIZE);
- cnt=recv(clientfd,buf,BUFSIZE,0);
- if(cnt==-1){
- perror("recv error");
- exit(1);
- }
- printf("Received:%s\n",buf);
- close(clientfd);
- if ( strncmp(buf,"exit",4) == 0 ){
- break;
- }
- }
- close(hostfd);
- return 0;
- }
复制代码
上面是服务器端的程序,请问有什么问题的会导致:
如果addrlen定义在buf之前的话,当客户端发送数据时,就会输出:
accept error: Invalid argument
如果buf定义在addrlen之前的话,当客户端发送数据时,就可以正常运行的??????
附加客户端程序如下:
- #include<stdio.h>
- #include<sys/types.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<stdlib.h>
- #include<string.h>
- #include<arpa/inet.h>
- #include<unistd.h>
- #define PORT 3001
- #define BUFSIZE 256
- int main(int argc,char**argv){
- int sockfd;
- int ret;
- int cnt;
- char buf[BUFSIZE];
- struct sockaddr_in sock_addr;
- if(argc!=2){
- printf("argument error");
- exit(1);
- }
- sockfd=socket(AF_INET,SOCK_STREAM,0);
- if(sockfd==-1){
- perror("socket error");
- exit(1);
- }
- sock_addr.sin_family=AF_INET;
- sock_addr.sin_port=htons(PORT);
- //sock_addr.sin_addr.s_addr=INADDR_ANY;
- sock_addr.sin_addr.s_addr=inet_addr("127.0.0.1");
- memset(sock_addr.sin_zero,0,sizeof(sock_addr.sin_zero));
- ret=connect(sockfd,(struct sockaddr*)&sock_addr,sizeof(struct sockaddr));// 阻塞
- if(ret==-1){
- perror("connect error");
- exit(1);
- }
- strcpy(buf,argv[1]);
- cnt=send(sockfd,buf,BUFSIZE,0);
- if(cnt==-1){
- perror("send error");
- exit(1);
- }
- printf("Send:%s\n",buf);
- close(sockfd);
- return 0;
- }
复制代码
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
确认只是修改两句定义的位置?
我知道原因了{:3_200:},原来我在调用accept之前没有初始化addrlen
导致了accept error:invalid argument
复制代码