Linux客户端和Window服务器端udp socket通信不能成功

作者&投稿:柏垂 (若有异议请与网页底部的电邮联系)
UDP和Socket通信步骤~

这是在网上找到的,希望对你有所帮助。
sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字(SOCK_DGRAM),原始套接字(SOCK_RAW);

WINDOWS环境下TCP/UDP编程步骤:

1. 基于TCP的socket编程是采用的流式套接字。

在这个程序中,将两个工程添加到一个工作区。要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:将套接字设置为监听模式等待连接请求(listen());

4:请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept());

5:用返回的套接字和客户端进行通信(send()/recv());

6:返回,等待另一连接请求;

7:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;



wVersionRequested = MAKEWORD( 1, 1 );



err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

return;

}



if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );

return;

}

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);



bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR_IN addrClient;

int len=sizeof(SOCKADDR);

while(1)

{

SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

char sendBuf[50];

sprintf(sendBuf,"Welcome %s to here!",inet_ntoa(addrClient.sin_addr));

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

char recvBuf[50];

recv(sockConn,recvBuf,50,0);

printf("%s
",recvBuf);

closesocket(sockConn);

}

}

客户端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:向服务器发出连接请求(connect());

3:和服务器端进行通信(send()/recv());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

客户端的代码如下:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;



wVersionRequested = MAKEWORD( 1, 1 );



err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

return;

}



if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 ) {

WSACleanup( );

return;

}

SOCKET sockClient=socket(AF_INET,SOCK_STREAM,0);



SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf[50];

recv(sockClient,recvBuf,50,0);

printf("%s
",recvBuf);

send(sockClient,"hello",strlen("hello")+1,0);



closesocket(sockClient);

WSACleanup();

}

2.基于UDP的socket编程是采用的数据报套接字。

在这个程序中,将两个工程添加到一个工作区。同时还要链接一个ws2_32.lib的库文件。

服务器端编程的步骤:

1:加载套接字库,创建套接字(WSAStartup()/socket());

2:绑定套接字到一个IP地址和一个端口上(bind());

3:等待和接收数据(sendto()/recvfrom());

4:关闭套接字,关闭加载的套接字库(closesocket()/WSACleanup())。

服务器端代码如下:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;



wVersionRequested = MAKEWORD( 1, 1 );



err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 )

{

return;

}

if ( LOBYTE( wsaData.wVersion ) != 1 ||

HIBYTE( wsaData.wVersion ) != 1 )

{

WSACleanup( );

return;

}

SOCKET sockSrv=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(7003);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

char recvBuf[50];

SOCKADDR addrClient;

int len=sizeof(SOCKADDR);

recvfrom(sockSrv,recvBuf,50,0,(SOCKADDR*)&addrClient,&len);

printf("%s
",recvBuf);

closesocket(sockSrv);

WSACleanup();

}

对于基于UDP的socket客户端来说,要进行如下步骤:

1:创建一个套接字(socket);

2:向服务器发送数据(sendto);

3:关闭套接字;

代码如下:

#include

#include

void main()

{

WORD wVersionRequested;

WSADATA wsaData;

int err;



wVersionRequested = MAKEWORD( 2, 2 );



err = WSAStartup( wVersionRequested, &wsaData );

if ( err != 0 ) {

return;

}

if ( LOBYTE( wsaData.wVersion ) != 2 ||

HIBYTE( wsaData.wVersion ) != 2 ) {

WSACleanup( );

return;

}

SOCKET sockClient=socket(AF_INET,SOCK_DGRAM,0);

SOCKADDR_IN addrClient;

addrClient.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");

addrClient.sin_family=AF_INET;

addrClient.sin_port=htons(8889);

SOCKADDR_IN addrSrv;

sendto(sockClient,"hi",3,0,(SOCKADDR*)&addrClient,sizeof(SOCKADDR));

}

LINUX环境下TCP/UDP编程步骤:

TCP编程步骤:

一. 服务端:

1.socket(int domain,int type,int protocol):建立套接字;

2 .bind(int sockid,struct sockaddr *addrp,socklen_t addrlen):把本机地址和端口跟上一步建立的socket绑定在一起;

3.listen(int sockid,int qsize):监听某套接字;

4.fd=accept(int sockid,struct sockaddr *callerid,socklen_t *addrlenp):等待某套接字接收信息;

5.recv(int fd,void *buf,size_t nbytes,int flags):从套接字接收数据;

6.close(fd) 和close(sockid)

二.客户端:

1. socket():建立套接字;

2.connect(int sockid,struct sockaddr *serv_addrp,socklen_t addrlen):连接到服务器;

3. send(int sockfd,const void *buf,size_t nbytes,int flags):发送数据到服务器.

4. close(sockid);

UDP编程步骤:

一,服务端:

1. socket():同上;

2. bind():同上;

3. recvfrom(int sockfd,void*buff,size_t nbytes,int flags,struct sockaddr*from,socklen_t*addrlen):在套接字口接收数据,并且记录下接收到的数据来源;一定要注意这里的参数addrlen,它不仅是函数的输出,也是函数的输入!所以要在调用该函数之前对addrlen赋值sizeof(struct sockaddr)。否则返回的地址from将会出错!

4. close(sockfd);

二. 客户端:

1. socket();同上;

2. sendto(int sockfd,const void*buff,size_t nbytes,int flags,const struct sockaddr*to,socklen_t addrlen):往指定的地址发送数据;

3. close(sockfd);

上面代码没问题,用Linux虚拟机和window调试时,不能选用Bridge方式,改用NAT方式即可。
因为系统环境不同,这样慢慢地很容易就找到问题出在哪里,打个比方?触发了里面有什么内容,它发送一条消息少年。这类问题(是打比方,精确到端口,语言不同。打印出来看,一步一步排查就行,不限于这一个问题)
另外的可能就是linux客户端上的代码运行机制问题。
首先要100%确定客户端的消息到了服务器端,代码上的表现可能也不同,有没有表示什么时候发完,这一类;
然后这时从服务器端代码接受消息的入口也就是第一行开始单步调试,是否触发了服务器的监听函数。也就是结束符,服务器可能一直在等单条消息的结束

上面代码没问题,用Linux虚拟机和window调试时,不能选用Bridge方式,改用NAT方式即可。
因为系统环境不同,这样慢慢地很容易就找到问题出在哪里,打个比方?触发了里面有什么内容,它发送一条消息少年。这类问题(是打比方,精确到端口,语言不同。打印出来看,一步一步排查就行,不限于这一个问题)
另外的可能就是linux客户端上的代码运行机制问题。
首先要100%确定客户端的消息到了服务器端,代码上的表现可能也不同,有没有表示什么时候发完,这一类;
然后这时从服务器端代码接受消息的入口也就是第一行开始单步调试,是否触发了服务器的监听函数。也就是结束符,服务器可能一直在等单条消息的结束

少年,一步一步排查就行。
首先你要100%确定客户端的消息到了服务器端,精确到端口;
然后这时从服务器端代码接受消息的入口也就是第一行开始单步调试,是否触发了服务器的监听函数?触发了里面有什么内容?打印出来看,这样慢慢地很容易就找到问题出在哪里;

另外的可能就是你linux客户端上的代码运行机制问题,打个比方,它发送一条消息,有没有表示什么时候发完?也就是结束符,服务器可能一直在等单条消息的结束。这类问题(是打比方,这一类,不限于这一个问题),因为系统环境不同,语言不同,代码上的表现可能也不同。


linux与windows的区别是什么?
2、软件与支持 windows下可以运行绝大部分软件、玩99.999%的游戏、硬件厂商近乎100%的支持。linux下可直接运行的软件数量和win下比起来就是1和99的区别,而且目前选择linux的人基本不会考虑玩游戏(虽然有能在linux下运行的游戏,但实在太少。),同时linux正期待更多硬件厂商的支持。 3、安全性 很多...

LINUX系统和WINDOWS系统,有什么区别?
详情请查看视频回答

Linux和Windows的区别。
详情请查看视频回答

Linux系统和Windows系统相比,优劣势是什么?
3. 首先你需要明白,Linux不是windows,它不是一个由一家商业公司维护的软件 , 只有一个包装。Linux是可以任意包装自由配置的东西。任何一个人,一家公司 都可以按照自己的想法,比如加一点功能,加中文支持,作一个Linux出来。这些 Linux虽然核心部分都一样,但是他们所带的各种软件,缺省的配置都不一样。区 别是用一...

谁知道linux操作系统和 windows 的优点 缺点 区别 ??
Linux虽然核心部分都一样,但是他们所带的各种软件,缺省的配置都不一样。区别是用一种Linux 发布 (不同的Linux我们叫做不同的发布)也许硬件很好配置, 各种软件也好安装,用另外一种也许速度快,再一种也许支持中文比较好。总之 没有白吃的午餐,在windows下想当然的东西在linux下也许需要你熬夜才能得到...

请问LINUX系统和WINDOWS系统的区别有那些?
区别1:开放性 所谓的开放性就是linux操作系统是开放源码系统,可以对其程序进行编辑修改。而微软的windows系统是手微软版权保护,就是只能微软内部进行开发及修改。区别2:价格不同 linux系统是免费使用,而微软开发的windows系统则是需要花费金钱去购买。区别3:文件格式不同 windows 操作系统内核是NT,而...

Linux操作系统与windos有什么区别 那种比较好啊
1、Linux和Windows在使用上的差别:L不容易上手,命令多不说,而且还有点麻烦。对外部设备,经常都是现用现加载。而且在使用完了以后还要卸载。这对于一般的普通用户来说,是一件很麻烦也很不情愿见到的事情。而对于W,就不用我多说了。其次,在使用上,L多数时候是使用文字界面,靠键盘输入命令来...

 Windows、Linux区别?
1.Linux的操作比较复杂,windows的比较简单.Linux速度比较快,安全性比windows好 但是有很多软件只能在windows里运行 与Linux兼容的软件正在开发中.Linux适用在网络方面.2. 什么是Linux?简单地说, Linux是一套免费使用和自由传播的类 Unix操作系统,它主要用于基 于 Intel x86系列 CPU的计算机上。这个系统...

linux操作系统和windows操作系统的区别
详情请查看视频回答

Linux下 W命令显示结果的含义
Linux下 W命令显示结果的含义 [root@localhost~]#w19:54:28up6min,1user,loadaverage:0.04,0.47,0.30USERTTYFROMLOGIN@IDLEJCPUPCPUWHATrootpts\/0219.216.158.12619:500.00s0.05s0.02sw“IDLEJCPUPCPU”这三个代表... [root@localhost ~]# w 19:54:28 up 6 min, 1 user, load average: 0.04, 0.47, ...

邹城市15330047822: linux怎样连接windows系统 -
张达艾贝: 利用Telnet连接Linux服务器需要确保:windows客户端开启telnet功能、linux服务器开启telnet服务首先,linux服务器开启telnet服务: 许多Linux系统在默认情况下是不安装Telnet服务的.在此介绍yum安装Telnet服务,它的优点是联网条件下能够...

邹城市15330047822: win客户端和linux客户端的区别 -
张达艾贝: 二者不同之处在于, security = user 时[root@redhat samba]# smbclient //192.168.7.113/westosEnter root's password:Anonymous login successful //系统提示登录samba服务成功,但是访问westos共享目录失败,匿名用户也是用户.Domain...

邹城市15330047822: Linux server与windows server的区别 -
张达艾贝: 首先,平均故障时间少,只要配置和使用得当,linux的平均故障(就是需要关机或者重启)的时间为一年多,每年重启维护一次不算过分吧?windows能做到一年只重启一次么?展开全部 其次,类unix从文件系统起就有严谨的安全机制,最简单...

邹城市15330047822: linux和windows server的联系和区别 -
张达艾贝: 区别在于内核不同,一个是windows操作系统,一个是linux. 联系就是都是针对服务器的操作系统,网络控制能力很强.Windows系统现在强调自己是一个完全的GUI,但是实际上只能说是以GUI为主,根本无法完全去除对CUI的支持. 而CUI...

邹城市15330047822: Linux与windows server两种操作系统的联系与差别,, -
张达艾贝: 联系可以说没有,因为这windows server是服务器级的操作系统,Linux则是一大类操作系统的共同称呼,如(Redhat,Ubuntu等),当然,Linux操作系统中大部分的版本是支持服务器级的应用,也就是可以用于做为服务器的操作系统.就作为服...

邹城市15330047822: 服务器究竟linux还是windows好 -
张达艾贝: 各有利弊,下面简单的讲述下理由.linux与windows在服务器上的应用方面优势比较.一:稳定性对比 Linux稳定性更好,Linux更新无需重启,不会停止Server,这才是真正的Server;Linux服务器相对Windows服务器,宕机机率更低;Linux系统...

邹城市15330047822: windows和linux哪个好 -
张达艾贝: 1.Linux可以看到源代码,windows不行.这一点直接导致的结果就是在特殊应用的场合可以自行剪裁和定制所需的内核模块,这对于高级系统内核管理优化和驱动程序的开发相当有利,另外也因为代码可见,不用担心恶意功能或者后门,对于军...

邹城市15330047822: 服务器linux系统和windows系统的区别是什么呢?有什么优缺点呢 -
张达艾贝: linux安全、稳定、速度快、开源.windows漏洞多、不安全、稳定性、也比不上linux. linux主要为服务器而出现,windows为了用户桌面易操作而出现的.

邹城市15330047822: linux和window的比较 -
张达艾贝: 区别太多,只列举部分: windows 是桌面系统, Linux一般是命令行系统, 也有桌面版本,如ubuntu, redhat. windows 适用于普通用户, 傻瓜操作;linux主要用于作服务器,由专业人员使用和维护,一般使用的人都是开发者或专家,学习者一...

邹城市15330047822: window与Linux比较
张达艾贝: 1、中国官方OS → Linux 2、window是付费的;Linux是免费的 3、window内核和桌面是关联的; Linux桌面是Linux外挂程序 4、内网服务器:Window 外网服务器:Linux

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网