#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>//网络库。<WinSock.h>
#pragma comment(lib,"Ws2_32.lib")//只有32位的。<Wsock32.lib>对应<WinSock.h>库。
int main(void)
{
WORD wdVersion = MAKEWORD(2,2);//传入MAKEWORD宏里,存入wdVersion里。
//MAKEWORD:原理((WORD)(((BYTE)(((DWORD_PTR)(a))&0xff))| ((WORD)(((BYTE)(((DWORD_PTR)(b)) &0xff)))<<8))。
WSADATA wdScokMsg;
//LPWSADATA lpw = malloc(sizeof(WSADATA));
//int a = *((char*)&wdVersion);
//int b = *((char*)&wdVersion+1);
//WSAStartup(wdVersion, lpw);
int nRes=WSAStartup(wdVersion,&wdScokMsg);
if (0!=nRes)
{
switch (nRes)
{
case WSASYSNOTREADY:
printf("重启下电脑试试,或者检查网络库。\n");
break;
case WSAVERNOTSUPPORTED:
printf("请更新网络库。\n");
break;
case WSAEINPROGRESS:
printf("请重新启动软件。\n");
break;
case WSAEPROCLIM:
printf("请尝试关掉不必要的软件,以为当前网络运行提供充足的资源。\n");
break;
/*case WSAEFAULT://参数问题。
break;*/
}
}
//校验版本。
if (2 != HIBYTE(wdScokMsg.wVersion) || 2 != LOBYTE(wdScokMsg.wVersion))
{
//说明版本不对。
//清理网络库。
WSACleanup();
return 0;
}
SOCKET socketServer = socket(AF_INET, SOCK_STREAM,12);
//成功返回可用的socket。失败返回INVALID_SOCKET。
//int a = WSAGetLastError();//检测最近的系统定义函数。
if (INVALID_SOCKET==socketServer)
{
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
//创建失败。
//清理网络库。
WSACleanup();
return 0;
}
//绑定地址与端口。
struct sockaddr_in si;
si.sin_family = AF_INET;
si.sin_port = htons(12345);//端口号
si.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
if (SOCKET_ERROR== bind(socketServer, (const struct sockaddr*)&si, sizeof(si)))//失败返回SOCKET_ERROR。成功返回0。
{
//出错了,SOCKET_ERROR是一个int类型的-1。
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
//释放
closesocket(socketServer);
//清理网络库。
WSACleanup();
return 0;
}
//监听。
if (SOCKET_ERROR == listen(socketServer, SOMAXCONN))
{
//出错了,SOCKET_ERROR是一个int类型的-1。
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
//释放
closesocket(socketServer);
//清理网络库。
WSACleanup();
return 0;
}
//创建客户端socket.
struct sockaddr_in clientMsg;
int len = sizeof(clientMsg);
SOCKET socketClient = accept(socketServer, (struct sockaddr*)&clientMsg, &len);
//SOCKET socketClient=accept(socketServer,NULL,NULL);
if (INVALID_SOCKET == socketClient)
{
printf("客户端链接失败\n");
//出错了,SOCKET_ERROR是一个int类型的-1。
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
//释放
closesocket(socketServer);
//清理网络库。
WSACleanup();
return 0;
}
printf("客户端链接成功\n");
//接收数据。
char buf[1500] = { 0 };
int res=recv(socketClient, buf, 1499, 0);
if (0 == res)
{
printf("链接中断,客户端下线。\n");
}
else if (SOCKET_ERROR==res)
{ //出错了。
printf("执行出错\n");
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
}
else
{
printf("%d %s\n", res, buf);
}
//发送数据。
char buf1[1500] = { "abcdef" };
int res1 = send(socketClient,buf1 , sizeof(buf1), 0);
if (SOCKET_ERROR == res1)
{ //出错了。
printf("执行出错\n");
int a = WSAGetLastError();//检测最近的系统定义函数。值为10043,请求的协议还没有在系统中配置,或者没有它存在的迹象。
}
//关闭释放。
closesocket(socketClient);
////如果WSACleanup与closesocket(socketServer)顺序放反了则a返回10093,应用程序没有调用 WSAStartup,或者 WSAStartup 失败。
////清理网络库。
//int b= WSACleanup();
////关闭释放。
//int c= closesocket(socketServer);
//int a = WSAGetLastError();
//关闭释放。
closesocket(socketServer);
//清理网络库。
WSACleanup();
////free(lpw);
system("pause");
return 0;
}
send:
1、作用:向目标发送数据。本质上是send函数将数据复制粘贴进系统的协议发送缓冲区,计算机找准时机发送出去。最大传输单元为1500。
2、参数1:目标的socket,客户端唯一 一个socket。
3、参数2:给对方发送的字符数组。
4、参数3:字节个数。
5、参数4:写0即可。其他:MSG_OOB意义同recv,带 外数据,传输一段数据,再外带一个额外的数据。MSG_DONTROUTE:指定数据不受路由器限制。
6、返回值:成功则返回写入的字节数。失败返回SOCKET_ERROR。
820

被折叠的 条评论
为什么被折叠?



