LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1006|回复: 4

socket新手遇到的问题

[复制链接]
发表于 2006-9-16 14:57:38 | 显示全部楼层 |阅读模式

  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <unistd.h>
  4. #include <netinet/in.h>
  5. #include <stdio.h>
  6. #include <string.h>

  7. #define PORT 55555

  8. int main()
  9. {
  10.         int sockfd;
  11.         int client_fd;
  12.        
  13.         socklen_t sizeSin;
  14.         char str[50];
  15.        
  16.         struct sockaddr_in myAddr;
  17.         struct sockaddr_in clientAddr;
  18.        
  19.         myAddr.sin_family = AF_INET;
  20.         myAddr.sin_port = htons(PORT);
  21.         myAddr.sin_addr.s_addr = INADDR_ANY;
  22.         //memset(myAddr, 0, 8);
  23.        
  24.         sockfd = socket(AF_INET, SOCK_STREAM, 0);
  25.         if (-1 == sockfd)
  26.         {
  27.                 return 1;
  28.         }
  29.        
  30.         if ( -1 == (bind(sockfd, (sockaddr*)&myAddr, sizeof(myAddr))) )
  31.         {
  32.                 return 1;
  33.         }
  34.        
  35.         listen(sockfd, 5);
  36.        
  37.         do
  38.         {
  39.                 sizeSin = sizeof(sockaddr_in);
  40.                 client_fd= accept( sockfd,(sockaddr*)&clientAddr, &sizeSin );
  41.                 if (-1 == client_fd)
  42.                 {
  43.                         return 1;
  44.                 }
  45.                 printf("connect success!");

  46.                 read(client_fd, str, sizeof(str));
  47.                 printf("%s", str);
  48.                 if (strcmp(str, "over") == 0)
  49.                 {
  50.                         break;
  51.                 }
  52.         } while(1);
  53.         close(client_fd);
  54.         return 0;
  55. }


复制代码


//这是服务器!我也写了客户端,但不管怎么样,这个服务器总是处于等待状态.哪怕客户端与它相连也不会打印connect success!

我怕是client的问题,所以我在终端用telnet测试可以

root@ediwon:~# telnet 127.0.0.1 55555
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.


请问这个服务端哪里有问题啊??? 谢谢了.刚毕业,在家自学的确不容易的, 希望大家能帮助的帮助一下
发表于 2006-9-16 19:55:37 | 显示全部楼层
编译通不过阿,稍微改了下,可以接收数据了
  1. #include <sys/types.h>
  2. #include <sys/socket.h>
  3. #include <unistd.h>
  4. #include <netinet/in.h>
  5. #include <stdio.h>
  6. #include <string.h>

  7. #define PORT 55555

  8. int main()
  9. {
  10.         int sockfd;
  11.         int client_fd;
  12.        
  13.         socklen_t sizeSin;
  14.         char str[50];
  15.        
  16.         struct sockaddr_in myAddr;
  17.         struct sockaddr_in clientAddr;
  18.        
  19.         myAddr.sin_family = AF_INET;
  20.         myAddr.sin_port = htons(PORT);
  21.         myAddr.sin_addr.s_addr = INADDR_ANY;
  22.         //memset(myAddr, 0, 8);
  23.        
  24.         sockfd = socket(AF_INET, SOCK_STREAM, 0);
  25.         if (-1 == sockfd)
  26.         {
  27.                 return 1;
  28.         }
  29.        
  30.         if ( -1 == (bind(sockfd, (struct sockaddr*)&myAddr, sizeof(myAddr))) )
  31.         {
  32.                 return 1;
  33.         }
  34.        
  35.         listen(sockfd, 5);
  36.        
  37.         do
  38.         {
  39.                 sizeSin = sizeof(struct sockaddr_in);
  40.                 client_fd= accept( sockfd,(struct sockaddr*)&clientAddr, &sizeSin );
  41.                 if (-1 == client_fd)
  42.                 {
  43.                         return 1;
  44.                 }
  45.                 printf("connect success!");

  46.                 read(client_fd, str, sizeof(str));
  47.                 printf("%s", str);
  48.                 if (strcmp(str, "over") == 0)
  49.                 {
  50.                         break;
  51.                 }
  52.         } while(1);
  53.         close(client_fd);
  54.         return 0;
  55. }

复制代码
telnet连上后你在telnet里输入字符串,服务端能显示。不过程序里还是有问题的,比如直接把接收的东西当字符串显示和作字符串比较,其实不能保证接收到的数据是\0结尾
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-16 20:44:13 | 显示全部楼层
感谢X11

仔细再测试发现我写的代码的确没问题. 问题出现在我telnet后没有输入字符,回车,当然server的accept处于等待,当然就不会打印connect success!

ps:我是在g++编译的,(不是gcc)所以结构体定义时可以省去struct关键字...呵呵!!!

再次谢谢...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-9-16 20:47:23 | 显示全部楼层
还有一个简单的问题就是:
unix socket文档上都说要用bzero或memset将置零
如:
struct sockaddr_in myAddr;
将myAddr.sin_zero置0.但我发现我每次测试时都没有置零,都没有任何影响
回复 支持 反对

使用道具 举报

发表于 2006-9-18 12:47:47 | 显示全部楼层
一定要清零的哦,你没有清零能用只是没有用到那些和是不是0有关的字段,如果用到了一定会出现问题的.(不知道我有没有说清楚,因为我也是初学)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表