Tcp编程基础

来源:互联网 发布:coc皮卡升级数据 编辑:程序博客网 时间:2024/05/17 09:26
服务端:
//1. 使用WSAStartup()初始化套接字库.相当于分配网络资源。
//可以想到有个对应释放资源的函数WSACleanup()
WSADATA wsaData;
// WORD wVersionRequested = MAKEWORD(1, 1);
int err = WSAStartup(0x0101, &wsaData);
if (err != 0)
{
return;
}

if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) 
WSACleanup();
return; 
}

//2. 创建套接字。使用结束后,需要用closesocket()关闭套接字
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
if (INVALID_SOCKET == sockSrv)
{
WSACleanup();
return;
}

//3. 绑定套接字到6000端口,注意网络字节序
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_port = htons(6000);
addrSrv.sin_family = AF_INET;

int x = sizeof(SOCKADDR);
int y = sizeof(SOCKADDR_IN);

err = bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
if (0 != err)
{
WSACleanup();
return;
}

//4. 监听客户端的请求
listen(sockSrv, SOMAXCONN);

//5. 循环处理每个监听到的客户端请求
SOCKADDR_IN addrClient; 
int len = sizeof(SOCKADDR);

// while (1)
{
//5.1 接受客户端请求,得到客户端信息于addrClient中
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);

//5.2 向该客户端发送数据
char sendBuf[100];
sprintf(sendBuf, "网管: %s, 欢迎光临605聊天室.", inet_ntoa(addrClient.sin_addr));
send(sockConn, sendBuf, strlen(sendBuf) + 1, 0);

//5.3 接受客户端数据
char recvBuf[100];
int nRecv = recv(sockConn, recvBuf, 100, 0);
if (nRecv > 0)
{
recvBuf[nRecv] = '\0';
printf("%s\n", recvBuf);
}

//5.4 关闭当前客户端连接
closesocket(sockConn);

//如果接受到"88"则退出监听. (不合理,需要改进)
//if (strcmp(recvBuf, "88") == 0) break;
}

//6.关闭服务端连接
closesocket(sockSrv);

//7.释放套接字库资源
WSACleanup();
客户端:
//1. 使用WSAStartup()初始化套接字库.相当于分配网络资源。 //可以想到有个对应释放资源的函数WSACleanup() WSADATA wsaData; WORD wVersionRequested = MAKEWORD(1, 1); //请求套接字 1.1 版本 int err = WSAStartup(wVersionRequested, &wsaData); if (err != 0) return;
if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)  { WSACleanup(); return;  }
//2. 创建套接字 SOCKET sockConn = socket(AF_INET, SOCK_STREAM, 0); //3. 向服务器端发起连接请求 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(sockConn, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR));
//4.接受服务端数据 char recvBuf[100]; recv(sockConn,recvBuf,100,0); printf("%s\n",recvBuf);
//5.发送数据 send(sockConn, "李四: 网管你好,我是李四。", strlen("李四: 网管你好,我是李四。") + 1, 0); //6.关闭连接,本次客户请求完成 closesocket(sockConn);
//7.释放相关网络资源 WSACleanup();
原创粉丝点击