Windows下纯C代码socket编程源码演示
同一主机或者用一局域网之间进行通信。
服务端代码:
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<WinSock2.h>
#pragma comment(lib,"Ws2_32.lib")
int main(){
WORD wdversion = MAKEWORD(2, 2);
WSADATA wdsockmsg;
int nres = WSAStartup(wdversion, &wdsockmsg);
if (nres != 0){
switch (nres)
{
case WSASYSNOTREADY:
printf("重启一下电脑试试");
break;
case WSAVERNOTSUPPORTED:
printf("请更新网络库");
break;
case WSAEINPROGRESS:
printf("请重新启动");
break;
case WSAEPROCLIM:
printf("请关掉不必要的软件");
break;
}
return 0;
}
if (HIBYTE(wdsockmsg.wVersion) != 2 || LOBYTE(wdsockmsg.wVersion) != 2)
{
WSACleanup();
return 0;
}
SOCKET socketsever = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socketsever == INVALID_SOCKET)
{
int error = WSAGetLastError();
WSACleanup();
return 0;
}
struct sockaddr_in sever;
sever.sin_family = AF_INET;
sever.sin_port = htons(12345);
sever.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
bind(socketsever, (const struct sockaddr*)&sever, sizeof(sever));
listen(socketsever, SOMAXCONN);
if (listen(socketsever, SOMAXCONN) == SOCKET_ERROR)
{
int error2 = WSAGetLastError();
closesocket(socketsever);
WSACleanup();
return 0;
}
struct sockaddr_in client;
int len = sizeof(client);
SOCKET socketclient = accept(socketsever, (struct sockaddr*)&client, &len);
if (socketsever == INVALID_SOCKET)
{
printf("客户端连接失败\n");
int error3 = WSAGetLastError();
closesocket(socketsever);
WSACleanup();
return 0;
}
printf("客户端连接成功\n");
Sleep(100000);
char buf1[1024];
scanf("%s", buf1);
send(socketclient, buf1, sizeof(buf1), 0);
int res2 = send(socketclient, buf1, strlen(buf1), 0);
if (res2 == SOCKET_ERROR)
{
int error5 = WSAGetLastError();
printf("请根据错误码解决.\n");
return 0;
}
char buf2[1000] = { 0 };
recv(socketclient, buf2, 1000, 0);
printf("我收到的是:%s\n", buf2);
closesocket(socketclient);
closesocket(socketsever);
WSACleanup();
system("pause");
}
客户端代码
#define _CRT_SECURE_NO_WARNINGS
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<WinSock2.h>
#include<string.h>
#pragma comment(lib,"Ws2_32.lib")
int main(){
WORD wdversion = MAKEWORD(2, 2);
WSADATA wdsockmsg;
int nres = WSAStartup(wdversion, &wdsockmsg);
if (nres != 0){
switch (nres)
{
case WSASYSNOTREADY:
printf("重启一下电脑试试");
break;
case WSAVERNOTSUPPORTED:
printf("请更新网络库");
break;
case WSAEINPROGRESS:
printf("请重新启动");
break;
case WSAEPROCLIM:
printf("请关掉不必要的软件");
break;
}
return 0;
}
if (HIBYTE(wdsockmsg.wVersion) != 2 || LOBYTE(wdsockmsg.wVersion) != 2)
{
WSACleanup();
return 0;
}
SOCKET socketsever = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (socketsever == INVALID_SOCKET)
{
int error = WSAGetLastError;
WSACleanup();
return 0;
}
struct sockaddr_in sever;
sever.sin_family = AF_INET;
sever.sin_port = htons(12345);
sever.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
connect(socketsever, ( struct sockaddr*)&sever, sizeof(sever));
int res1 = connect(socketsever, (const struct sockaddr*)&sever, sizeof(sever));
if (res1 == SOCKET_ERROR)
{
int error = WSAGetLastError;
closesocket(socketsever);
WSACleanup();
return 0;
}
char buf[1500] = { 0 };
int res = recv(socketsever, buf, 1024, 0);
if (res == 0)
{
printf("连接中断,客户端下线\n");
}
else if (res == SOCKET_ERROR)
{
int error4 = WSAGetLastError;
return 0;
}
else
{
printf("%d %s\n", res, buf);
}
char buf2[1024] = { 0 };
gets(buf2);
for (int i = 0; i < 3; i++)
{
send(socketsever, buf2, 1024, 0);
}
closesocket(socketsever);
WSACleanup();
system("pause");
return 0;
}