用winsock和C语言进行socket通讯编程,要求服务端和客户端能互相发送接收数据
时间: 2024-02-27 15:58:21 浏览: 25
好的,这是一个简单的示例代码,包括服务端和客户端的代码:
服务端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") //链接ws2_32.lib库文件
#define BUF_SIZE 1024
#define PORT 8888
int main()
{
WSADATA wsaData;
SOCKET servSock;
SOCKET clntSock;
char buffer[BUF_SIZE];
int strLen;
SOCKADDR_IN servAddr;
SOCKADDR_IN clntAddr;
int clntAddrSize;
// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
// 创建Socket
servSock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (servSock == INVALID_SOCKET)
{
printf("socket failed!\n");
WSACleanup();
return 1;
}
// 绑定Socket
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = htonl(INADDR_ANY);
servAddr.sin_port = htons(PORT);
if (bind(servSock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
{
printf("bind failed!\n");
closesocket(servSock);
WSACleanup();
return 1;
}
// 监听Socket
if (listen(servSock, 5) == SOCKET_ERROR)
{
printf("listen failed!\n");
closesocket(servSock);
WSACleanup();
return 1;
}
// 接受客户端请求
clntAddrSize = sizeof(clntAddr);
clntSock = accept(servSock, (SOCKADDR*)&clntAddr, &clntAddrSize);
if (clntSock == INVALID_SOCKET)
{
printf("accept failed!\n");
closesocket(servSock);
WSACleanup();
return 1;
}
// 与客户端进行通信
while (1)
{
memset(buffer, 0, BUF_SIZE);
strLen = recv(clntSock, buffer, BUF_SIZE, 0);
if (strLen == SOCKET_ERROR)
{
printf("recv failed!\n");
break;
}
send(clntSock, buffer, strLen, 0);
}
// 关闭Socket
closesocket(clntSock);
closesocket(servSock);
WSACleanup();
return 0;
}
```
客户端代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib") //链接ws2_32.lib库文件
#define BUF_SIZE 1024
#define PORT 8888
int main()
{
WSADATA wsaData;
SOCKET sock;
char buffer[BUF_SIZE];
int strLen;
SOCKADDR_IN servAddr;
// 初始化Winsock
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
{
printf("WSAStartup failed!\n");
return 1;
}
// 创建Socket
sock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
if (sock == INVALID_SOCKET)
{
printf("socket failed!\n");
WSACleanup();
return 1;
}
// 连接服务器
memset(&servAddr, 0, sizeof(servAddr));
servAddr.sin_family = AF_INET;
servAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
servAddr.sin_port = htons(PORT);
if (connect(sock, (SOCKADDR*)&servAddr, sizeof(servAddr)) == SOCKET_ERROR)
{
printf("connect failed!\n");
closesocket(sock);
WSACleanup();
return 1;
}
// 与服务器进行通信
while (1)
{
memset(buffer, 0, BUF_SIZE);
printf("Please input a string: ");
gets_s(buffer, BUF_SIZE);
if (strcmp(buffer, "exit") == 0)
{
break;
}
send(sock, buffer, strlen(buffer), 0);
strLen = recv(sock, buffer, BUF_SIZE, 0);
if (strLen == SOCKET_ERROR)
{
printf("recv failed!\n");
break;
}
printf("Message from server: %s\n", buffer);
}
// 关闭Socket
closesocket(sock);
WSACleanup();
return 0;
}
```
注意:以上代码仅供参考,实际使用中还需要进行错误处理和异常情况处理。