C++下Socket编程

来源:互联网 发布:粉红女郎 知乎 编辑:程序博客网 时间:2024/06/03 23:46

头文件#include<WinSock2.h>

套接字库#pragma comment(lib,"ws2_32.lib")

客户端:

加载套接字库

WSADATA wsaData;

int err;

err=WSAStartup(MAKEWORD(2,2),&wsaData);

if(err!=0)

{

return;

}

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

{

WSACleanup();

return;

}

创建套接字

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

SOCKADDR_IN addrServ;

addrServ.sin_addr.S_un.S_addr=inet_addr("192.168.0.110");

addrServ.sin_family=AF_INET;

addrServ.sin_port=htons(6000);

int t=connect(sockClient,(SOCKADDR *)&addrServ,sizeof(SOCKADDR));

if(t==-1)

{

return false;

}

接收数据

char buf[100];

int length=recv(sockClient,buf,100,0);

参数1为接收端套接字,参数2为接收缓存区,参数3为接收缓存区大小,参数4一般为0

执行流程:recv要等待sockClient的发送缓存中的数据发送完,recv还要等待协议接收数据完毕,recv函数copy接收缓存中的数据到buf中,若接收缓存中数据小于等于buf大小,则一次copy完,若接收缓存大于buf大小,则要调用若干次recv函数才能把接收缓存数据copy完。

recv返回copy的字节数。若协议在发送sockClient发送缓存中数据的时候出现网络错误,recv函数返回SOCKET_ERROR,若recv在copy时出现错误,则返回SOCKET_ERROR,若recv在等待协议接收数据时网络中断了,则返回0.

int nErrCode = WSAGetLastError();   // 获取错误代码    
if(WSAENOTCONN == nErrCode)    
{    
printf("套接字没有连接\n");    
} else if(WSAESHUTDOWN == nErrCode)    
{    
printf("套接字已经关闭\n");    
} else if(WSAETIMEDOUT == nErrCode)    
{    
printf("请求超时,主机没有反应\n");    
} else if(WSAECONNRESET == nErrCode)    
{    
printf("远程主机强迫关闭了现有的连接\n");    
}

发送数据

char * data="123";

int t=send(sockClient,data,strlen(data),0);

参数1为发送端套接字,参数2为发送数据缓冲区,参数3为发送数据缓冲区大小,参数4一般为0.

执行过程:strlen(data)大于sockClient发送缓冲区大小的话则返回SOCKET _ERROR,strlen(data)小于等于sockClient发送缓冲区大小的话,就判断协议是否在发送数据,若是就等数据发送完,若协议未发送缓冲区中数据或缓冲区为空,则比较len与发送缓冲区剩余空间,若strlen(data)大于剩余空间大小则等待协议把数据发送完,然后send把数据copy到发送缓冲区中,出现错误返回SOCKET_ERROR.

数据有协议发送和接受,copy和recv只负责copy数据





原创粉丝点击