套接字编程

最近也在学习,有一个自己写的C++聊天程序,有点大。以下是c写的。

套接字编程有三种:SOCK_STREAM、SOCK_DGRAM和Socket _ Raw。基于TCP的Socket编程采用SOCK_STREAM。基于UDP的数据报套接字(SOCK_DGRAM)。

1.TCP流套接字的编程步骤

使用前必须链接链接库功能:工程-->;设置-& gt;链接-& gt;输入ws2_32.lib,OK!

服务器端程序:

1,正在加载套接字库

2.创建一个套接字。

3.将套接字绑定到本地地址和端口。

4.将套接字设置为侦听模式,并准备接收客户请求(侦听)。

5.等待客户的要求到达;当请求到达时,接受连接请求并返回一个对应于这个连接的新套接字。

6.使用返回的套接字与客户端通信(send/recv)。

7.返回并等待另一个客户的请求。

8.关闭插座。

客户端程序:

1,正在加载套接字库

2.创建一个套接字。

3.向服务器发送连接请求。

4.与服务器通信(发送/接收)。

5.关闭插座

服务器端代码如下:

# include & ltWinsock2.h & gt//添加头文件

# include & ltstdio.h & gt//加载标准I/O头文件

void main()

{

WORD wVersionRequested//版本号

WSADATA wsaData

int err

wVersionRequested = make word(1,1);//1.1版本套接字

err = wsa startup(wVersionRequested,& ampwsa data);

如果(呃!= 0 ) {

返回;

}//加载套接字库,编辑失败返回。

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

HIBYTE( wsaData.wVersion)!= 1 ) {

WSACleanup();

返回;

}//如果不是1.1,则退出。

SOCKET sockSrv=socket(AF_INET,SOCK_STREAM,0);//创建一个套接字。

SOCKADDR _ IN addrSrv

addrSrv.sin_addr。S_un。s _ addr = htonl(in addr _ ANY);//将无符号短整型转换为网络字节顺序格式。

addrSrv.sin _ family = AF _ INET

addr SRV . sin _ port = htons(6000);

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

//将套接字绑定到本地地址和端口。

听(sockSrv,5);//将套接字设置为侦听模式,并准备接收客户端请求(侦听)。

SOCKADDR _ IN addrClient//定义地址族

int len = sizeof(SOCKADDR);//初始化这个参数,这个参数必须初始化。

while(1)

{

SOCKET sockConn=accept(sockSrv,(SOCKADDR *)& amp;addr client & amp;len);//accept的第三个参数必须有初始值。

//等待客户的要求;当请求到达时,接受连接请求并返回一个对应于这个连接的新套接字。

//程序此时被阻止在这里。

char send buf[100];

sprintf(sendBuf,"欢迎%s加入_ ntoa(addr client . sin _ addr));

//使用返回的套接字与客户端通信(send/recv)。

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

char recvBuf[100];

recv(sockConn,recvBuf,100,0);

printf("%s\n ",recvBuf);

close socket(sock conn);//关闭套接字。等待另一个用户请求

}

}

客户端代码如下:

# include & ltWinsock2.h & gt

# include & ltstdio.h & gt

void main()

{

WORD wVersionRequested

WSADATA wsaData

int err

wVersionRequested = make word(1,1);

err = wsa startup(wVersionRequested,& ampwsa data);加载套接字字体

如果(呃!= 0 ) {

返回;

}

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

HIBYTE( wsaData.wVersion)!= 1 ) {

WSACleanup();

返回;

}

SOCKET SOCK client = 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

addr SRV . sin _ port = htons(6000);

connect(sockClient,(SOCKADDR *)& amp;addrSrv,sizeof(SOCKADDR));向服务器发送连接请求。

char recvBuf[100];并与服务器通信(send/recv)。

recv(sockClient,recvBuf,100,0);

printf("%s\n ",recvBuf);

send(sockClient,"这是lisi ",strlen("这是lisi")+1,0);

close socket(sock client);关闭插座。

WSACleanup();//必须调用此函数来清除参数。

}