免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2308 | 回复: 6
打印 上一主题 下一主题

关于linux网络编程 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-18 08:02 |只看该作者 |倒序浏览
最近在学习linux环境下的网络编程
但是对socket还是不甚了解
这是我完成的第一个代码
功能:使用udp 能够接受一个字符串
这个是server

遇到问题有下:
1.如果将recvfrom放置在像for  (;;)中 ,则无法接受任何数据
2.如何知道该如何监听本机的端口
个人理解 作为一台server ,需要知道三个端口 udp源端口 udp目的端口 还有需要在本机上有一个端口用来收udp数据报 在以下代码中如何体现
像各位大牛求教
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<sys/types.h>
  4. #include<netinet/in.h>
  5. #include<sys/wait.h>
  6. #include<sys/socket.h>

  7. int main(){
  8.         int serverPort,clientPort;
  9.         struct sockaddr_in servAddr,clientAddr,unknown,local;
  10.         int serverLen,clientLen;
  11.         int sockfd,recvlen;
  12.         char buff[100];

  13.         sprintf(buff,"hello world");

  14.         sockfd = socket(AF_INET,SOCK_DGRAM,0);
  15.         
  16.         bzero(&servAddr,sizeof(servAddr));

  17.         servAddr.sin_family = AF_INET;
  18.         servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  19.         servAddr.sin_port = htons(1234);


  20.         bzero(&clientAddr,sizeof(clientAddr));

  21.         clientAddr.sin_family = AF_INET;
  22.         clientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  23.         clientAddr.sin_port = htons(1234);
  24.         
  25.         local.sin_family = servAddr.sin_family;
  26.         local.sin_addr.s_addr = servAddr.sin_addr.s_addr;
  27.         local.sin_port = servAddr.sin_port;

  28.         bind(sockfd,&local,sizeof(local));
  29.         while (1){
  30.         recvlen = recvfrom(sockfd,buff,100,0,&unknown,sizeof(unknown));
  31.         buff[recvlen] = 0;
  32.         printf("receive message is %s\n",buff);
  33.         }
  34.         close(sockfd);        

  35.         return 0;
  36. }
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-11-18 09:25 |只看该作者
本帖最后由 jiayanfu 于 2011-11-18 09:31 编辑

如果是udp server的话,你不用知道那么多条件,你只要绑定好本地的端口,然后等待收数据就行。udp client会往你的server端口扔数据,server收到的时候,自然也就知道了对应的是哪个客户端了
recvlen = recvfrom(sockfd,buff,100,0,&unknown,sizeof(unknown));  unknown 会把客户端的ip及端口告诉你哦!
所以  
       clientAddr.sin_family = AF_INET;

        clientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");

        clientAddr.sin_port = htons(1234);

应该没有什么用吧。。。

论坛徽章:
0
3 [报告]
发表于 2011-11-18 09:28 |只看该作者
你的第一个问题,我觉得还是贴代码,比较有说服力,鄙人认为应该会收到数据。

论坛徽章:
0
4 [报告]
发表于 2011-11-18 09:32 |只看该作者
你的第二个问题
bind(sockfd,&local,sizeof(local));不是将端口绑定到socket上了吗

论坛徽章:
0
5 [报告]
发表于 2011-11-18 15:13 |只看该作者
本帖最后由 zcheung 于 2011-11-18 15:17 编辑

首先沒有
  1. #include <arpa/inet.h>
  2. #include <netinet/in.h>
复制代码
第二

  1. bzero(&clientAddr,sizeof(clientAddr));
  2. clientAddr.sin_family = AF_INET;
  3. clientAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
  4. clientAddr.sin_port = htons(1234);
  5.         
  6. local.sin_family = servAddr.sin_family;
  7. local.sin_addr.s_addr = servAddr.sin_addr.s_addr;
  8. local.sin_port = servAddr.sin_port;
复制代码
這尼馬一大斷都是不需要的

第三 也是我想對你說的中心思想。
哥,有點網絡基礎知識好不好?看看書上的例子按這人家的做一邊好不好?

论坛徽章:
0
6 [报告]
发表于 2011-11-18 15:19 |只看该作者
又看了一下你的code


你的recvfrom寫的也不對阿

论坛徽章:
0
7 [报告]
发表于 2011-11-18 15:21 |只看该作者
好了,說句我最想對你說的話




爾乃智無敵之輩。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP