服务端:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
char sendbuf[256] = { 0 };
char receivebuf[256] = { 0 };
int sendLength = 0;
int recevieLength = 0;
int length = 0;
SOCKET socket_server;
SOCKET socket_receive;
SOCKADDR_IN server_addr;
SOCKADDR_IN client_addr;
WORD wversion = MAKEWORD(2, 2);
WSADATA wsadata;
int error = WSAStartup(wversion, &wsadata);
if (error != 0)
{
printf("ERROE!");
return;
}
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
{
printf("Version error!");
return;
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(9983);
socket_server = socket(AF_INET, SOCK_STREAM, 0);
bind(socket_server, (SOCKADDR*)&server_addr,sizeof(SOCKADDR));
listen(socket_server, 5);
length = sizeof(SOCKADDR);
socket_receive = accept(socket_server, (SOCKADDR*)&client_addr, &length);
while (1)
{
recevieLength = recv(socket_receive, receivebuf, 256, 0);
printf("接受到客户端:%s\n", receivebuf);
memset(receivebuf, 0, 256);
printf("请输入服务端返回发送数据:\n");
scanf("%s", &sendbuf);
sendLength = send(socket_receive, sendbuf, 256, 0);
memset(sendbuf, 0, 256);
}
closesocket(socket_server);
closesocket(socket_receive);
WSACleanup();
system("pause");
}
客户端:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock.h>
#pragma comment(lib,"ws2_32.lib")
void main()
{
char sendbuf[256] = { 0 };
char receivebuf[256] = { 0 };
int sendLength = 0;
int recevieLength = 0;
SOCKET socket_send;
SOCKADDR_IN server_addr;
WORD wversion = MAKEWORD(2, 2);
WSADATA wsadata;
int error = WSAStartup(wversion, &wsadata);
if (error != 0)
{
printf("ERROE!");
return;
}
if (LOBYTE(wsadata.wVersion) != 2 || HIBYTE(wsadata.wVersion) != 2)
{
printf("Version error!");
return;
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
server_addr.sin_port = htons(9983);
socket_send = socket(AF_INET, SOCK_STREAM, 0);
connect(socket_send, (SOCKADDR*)&server_addr, sizeof(SOCKADDR));
while (1)
{
printf("请输入发送的信息:\n");
scanf("%s", sendbuf);
sendLength = send(socket_send, sendbuf, 256, 0);
memset(sendbuf, 0, 256);
recevieLength = recv(socket_send, receivebuf, 256, 0);
printf("接受到服务端信息 %s:\n", receivebuf);
memset(receivebuf, 0, 256);
}
closesocket(socket_send);
WSACleanup();
system("pause");
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/420829abc81f124506291b281bdd734b.png)
TCP多线程 一对多接受与发送
服务端
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#define MSGLEN 256
#define PORT 8899
#define IP_ADDR "127.0.0.1"
DWORD WINAPI client_thread(void* vptr);
void main()
{
WSADATA wsadata;
SOCKET client;
SOCKET server;
SOCKADDR_IN client_addr ,locale_addr;
int addrLength = 0;
HANDLE hthread = NULL;
int result = 0;
char sendbuf[MSGLEN] = { 0 };
int error = WSAStartup(MAKEWORD(2, 2), &wsadata);
if (error != 0)
{
printf("ERROE!\n");
return;
}
server = socket(AF_INET, SOCK_STREAM, 0);
if (server == INVALID_SOCKET)
{
printf("The server failed to initialize!\n");
return;
}
locale_addr.sin_family = AF_INET;
locale_addr.sin_addr.s_addr = inet_addr(IP_ADDR);
locale_addr.sin_port = htons(PORT);
memset(locale_addr.sin_zero, 0x00, 8);
result = bind(server, (struct sockaddr*)&locale_addr, sizeof(locale_addr));
if (result != 0)
{
printf("绑定端口失败!\n");
return;
}
result = listen(server, 5);
if (result != 0)
{
printf("监听端口失败!\n");
return;
}
puts("服务起启动成功!");
while (1)
{
addrLength = sizeof(client_addr);
client = accept(server, (struct sockaddr*)&client_addr, &addrLength);
if (client == INVALID_SOCKET)
{
puts("接受失败!");
return;
}
printf("连接客户端:【IP】=%s ,【Port】=%d \n", inet_ntoa(client_addr.sin_addr), client_addr.sin_port);
hthread = CreateThread(NULL, 0, client_thread, (void*)client, 0, NULL);
}
closesocket(server);
closesocket(client);
WSACleanup();
system("pause");
}
DWORD WINAPI client_thread(void* vptr)
{
SOCKET client = (SOCKET)vptr;
int res = 0;
char recevicebuf[MSGLEN] = { 0 };
char sendbuf[MSGLEN] = { 0 };
while (1)
{
memset(recevicebuf, 0, MSGLEN);
memset(sendbuf, 0, MSGLEN);
res = recv(client, recevicebuf, MSGLEN, 0);
if (res == SOCKET_ERROR)
{
printf("Message acceptance failure!\n");
break;
}
else
{
printf("接受到:%s\n", recevicebuf);
}
sprintf(sendbuf, "接受到信息:%s\n", recevicebuf);
res = send(client, sendbuf, strlen(sendbuf), 0);
}
return 0;
}
客户端
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<winsock2.h>
#include <Ws2tcpip.h>
#pragma comment(lib,"ws2_32.lib")
#define MSGLEN 256
#define PORT 8899
#define IP_ADDR "127.0.0.1"
void main()
{
WSADATA wsadata;
SOCKET client;
SOCKADDR_IN server_addr;
int addrLength = 0;
HANDLE hthread = NULL;
int result = 0;
char sendbuf[MSGLEN] = { 0 };
int error = WSAStartup(MAKEWORD(2, 2), &wsadata);
if (error != 0)
{
printf("ERROE!\n");
return;
}
client = socket(AF_INET, SOCK_STREAM, 0);
if (client == INVALID_SOCKET)
{
printf("client create error!\n");
return;
}
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = inet_addr(IP_ADDR);
server_addr.sin_port = htons(PORT);
memset(server_addr.sin_zero, 0x00, 8);
result = connect(client, (SOCKADDR_IN*)&server_addr, sizeof(server_addr));
if (result != 0)
{
printf("The connection to the server failed!\n");
return;
}
char recevicebuf[MSGLEN] = { 0 };
while (1)
{
memset(recevicebuf, MSGLEN, 0);
puts("请输入要发送的消息:");
scanf("%s", sendbuf);
result = send(client, sendbuf, strlen(sendbuf), 0);
if (result == SOCKET_ERROR)
{
printf("Message delivery failed!\n");
}
memset(sendbuf, MSGLEN, 0);
result = recv(client, recevicebuf, MSGLEN, 0);
if (result == SOCKET_ERROR)
{
printf("接受服务端信息失败!\n");
}
printf("%s", recevicebuf);
}
closesocket(client);
WSACleanup();
system("pause");
}
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/e1b9a6ac53b73cb1675797ba73fffddb.png)