closesocket头文件|linux socket 的程序如何在windows下编译并运行

『壹』 Socket编程

最近也在学 还有一个自己写的C++聊天程序 有点大 下面是C写的sockets(套接字)编程有三种,流式套接字(SOCK_STREAM),数据报套接字 (SOCK_DGRAM),原始套接字(SOCK_RAW);基于TCP的socket编程是采用的流式套接字(SOCK_STREAM)。基于UDP采 用的数据报套接字(SOCK_DGRAM).1.TCP流式套接字的编程步骤在使用之前须链接库函数:工程->设置->Link->输入ws2_32.lib,OK!服务器端程序:1、加载套接字库2、创建套接字(socket)。 3、将套接字绑定到一个本地地址和端口上(bind)。4、将套接字设为监听模式,准备接收客户请求(listen)。5、等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。6、用返回的套接字和客户端进行通信(send/recv)。7、返回,等待另一客户请求。8、关闭套接字。客户端程序:1、加载套接字库2、创建套接字(socket)。 3、向服务器发出连接请求(connect)。4、和服务器端进行通信(send/recv)。5、关闭套接字服务器端代码如下:#include <Winsock2.h>//加裁头文件#include <stdio.h>//加载标准输入输出头文件void main(){WORD wVersionRequested;//版本号WSADATA wsaData;int err;wVersionRequested = MAKEWORD( 1, 1 );//1.1版本的套接字err = WSAStartup( wVersionRequested, &wsaData );if ( err != 0 ) {return;}//加载套接字库,加裁失败则返回if ( LOBYTE( wsaData.wVersion ) != 1 ||HIBYTE( wsaData.wVersion ) != 1 ) {WSACleanup( );return; }//如果不是1.1的则退出SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建套接字(socket)。SOCKADDR_IN addrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//转换Unsigned short为网络字节序的格式addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//将套接字绑定到一个本地地址和端口上(bind)listen(sockSrv,5);//将套接字设为监听模式,准备接收客户请求(listen)。SOCKADDR_IN addrClient;//定义地址族int len=sizeof(SOCKADDR);//初始化这个参数,这个参数必须被初始化while(1){SOCKET sockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);//accept的第三个参数一定要有初始值。//等待客户请求到来;当请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字(accept)。//此时程序在此发生阻塞char sendBuf[100];sprintf(sendBuf,"Welcome %s to http://www.sunxin.org",inet_ntoa(addrClient.sin_addr));//用返回的套接字和客户端进行通信(send/recv)。send(sockConn,sendBuf,strlen(sendBuf)+1,0);char recvBuf[100];recv(sockConn,recvBuf,100,0);printf("%s\n",recvBuf);closesocket(sockConn);//关闭套接字。等待另一个用户请求}}客户端代码如下:#include <Winsock2.h>#include <stdio.h>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);创建套接字(socket)。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));向服务器发出连接请求(connect)。char recvBuf[100];和服务器端进行通信(send/recv)。recv(sockClient,recvBuf,100,0);printf("%s\n",recvBuf);send(sockClient,"This is lisi",strlen("This is lisi")+1,0);closesocket(sockClient);关闭套接字。WSACleanup();//必须调用这个函数清除参数}

『贰』 在windows下用C语言如何实现socket网络编程,需要用到哪些头文件或者库

需要用到的头文件包含:

#include <winsock2.h>

#include <windows.h>

与linux环境下socket编程相比,windows环境多了一个步骤:启动或者初始化winsock库

Winsock,一种标准API,一种网络编程接口,用于两个或多个应用程序(或进程)之间通过网络进行数据通信。具有两个版本:

Winsock 1:

Windows CE平台支持。

头文件:WinSock.h

库:wsock32.lib

Winsock 2:

部分平台如Windows CE貌似不支持。通过前缀WSA可以区别于Winsock 1版本。个别函数如WSAStartup、WSACleanup、WSARecvEx、WSAGetLastError都属于Winsock 1.1规范的函数;

头文件:WinSock2.h

库:ws2_32.lib

mswsock.h用于编程扩展,使用时必须链接mswsock.dll

(2)closesocket头文件扩展阅读

winsock库的加载与卸载:

加载:int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

加载成功,返回值为0。

WORD wVersionRequested:加载的winsock版本,使用宏MAKEWORD(x, y),x表示高字节,y表示低字节。然而使用时MAKEWORD(2, 2)。高字节与低字节相同~~

LPWSADATA lpWSAData:WSADATA结构的指针,传入参数后,系统帮助我们填充版本信息。有兴趣的可以看看结构体内容,不过基本用不着。

卸载:int WSACleanup(void);比起加载,卸载的函数真是轻松愉快。

『叁』 socket编程在windows和linux下的区别是什么

1. 头文件

windows下winsock.h或winsock2.h

linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)

2. 初始化

windows下需要用WSAStartup启动Ws2_32.lib,并且要用#pragma comment(lib,"Ws2_32")来告知编译器链接该lib。

linux下不需要

3. 关闭socket

windows下closesocket(…)

linux下close(…)

4. 类型

windows下SOCKET

linux下int

5. 获取错误码

windows下getlasterror()/WSAGetLastError()

linux下,未能成功执行的socket操作会返回-1;如果包含了errno.h,就会设置errno变量

6. 设置非阻塞

windows下ioctlsocket()

linux下fcntl(),需要头文件fcntl.h

7. send函数最后一个参数

windows下一般设置为0

linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可能会导致程序退出

8. 毫秒级时间获取

windows下GetTickCount()

linux下gettimeofday()

『肆』 linux socket 的程序如何在windows下编译并运行

本质区别是这样的,linux下用的是伯克利socket,windows底下用的WinSocket. 两者其实是大同小异的,不同的地方在以下几点: 1 头文件不同,在linux下用到的关键头文件<sys/socket.h> windows下用到的是 <Winsock2.h> 2 socket的初始化不一样,在windows下要有一个WSAStartup,而linux 下没有。 3 具体的细节不一样,linux下的c和windows下的c的一些语法有些出入,你自己找找。下面我把windows下的socket通讯的最基本的结构给你,你对照着修改就可以了,一下的程序我调试了一下,编译过了。客户端 #include <Winsock2.h> #include <stdio.h> 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[100]; recv(sockClient,recvBuf,100,0); printf("%s\n",recvBuf); send(sockClient,"This is lisi",strlen("This is lisi")+1,0); closesocket(sockClient); WSACleanup(); } 服务器端 #include <Winsock2.h> #include <stdio.h> 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[100]; sprintf(sendBuf,"来自服务器端", inet_ntoa(addrClient.sin_addr)); send(sockConn,sendBuf,strlen(sendBuf)+1,0); char recvBuf[100]; recv(sockConn,recvBuf,100,0); printf("%s\n",recvBuf); closesocket(sockConn); } }


赞 (0)