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数据
- linux下socket c 编程
- Linux下C编程 -- Socket编程
- Linux C下socket编程API简介
- c在Windows下的socket编程
- Linux下C语言socket编程
- Linux下C语言socket编程
- linux下 socket编程(基于c)
- Linux下C语言socket网络编程
- linux下c编程socket通信
- Linux下C语言Socket编程
- linux下C语言 socket tcp编程
- Linux下基于C/C++的Socket编程实例
- C语言Linux下的Socket 编程(UDP)
- Linux下基于C/C++的Socket编程基础
- Linux下基于C/C++的Socket编程实例
- Linux下基于C/C++的Socket编程基础
- .Net下的Socket编程(c#)(一)
- .Net下的Socket编程(c#)(二)
- spring boot velocity自定义指令 java
- linux下mysql安装 主从复制和读写分离配置
- repo init报错Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
- hehheda
- 数据结构第二周项目2--程序的多文件组织
- C++下Socket编程
- 苹果2017秋季大会回顾
- Python中filter、map、reduce函数
- Linux网络编程多线程模型
- (CodeForces
- 在ubuntu上搭建caffe环境
- CGAL 4.10 官方文档 软件包概述 ——算术与代数类
- Pandas 使用教程 4
- 【oracle】使用sys进行的操作