可是这个代码我根本运行不了?
时间: 2023-12-20 13:17:50 浏览: 139
练习参考代码,不能运行
4星 · 用户满意度95%
这段代码确实存在一些问题,可能是因为它使用的是过时的 Winsock 1.1 版本,而不是 Winsock2。这可能导致一些编译错误或运行时错误。
另外,这段代码的 main() 函数返回类型应该是 int,而不是 void。因此,您可以尝试对代码进行一些修改,以使其能够编译和运行。以下是可能的修改:
1. 修改 main() 函数的返回类型为 int,如下所示:
```c
int main() {
```
2. 用 WSACleanup() 函数关闭 Winsock 库。在程序结束时添加以下代码:
```c
WSACleanup();
```
3. 在调用 bind() 函数之前,添加以下代码以设置套接字选项,以避免“地址已在使用中”的错误:
```c
int optval = 1;
setsockopt(sockSrv, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval));
```
4. 向 send() 函数添加 MSG_NOSIGNAL 标志,以避免 SIGPIPE 信号的问题:
```c
send(sockConn, sendBuf, strlen(sendBuf) + 1, MSG_NOSIGNAL);
```
5. 将 main() 函数中的 "return;" 修改为 "return 0;",以指示程序正常退出。
综上所述,以下是可能的修改后的代码:
```c
#include <stdio.h>
#include <Winsock2.h>
int main() {
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
return 1;
}
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
WSACleanup();
return 1;
}
SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, 0);
int optval = 1;
setsockopt(sockSrv, SOL_SOCKET, SO_REUSEADDR, (const char*)&optval, sizeof(optval));
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
addrSrv.sin_family = AF_INET;
addrSrv.sin_port = htons(6000);
bind(sockSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));
listen(sockSrv, 5);
SOCKADDR_IN addrClient;
int len = sizeof(SOCKADDR);
while (1) {
SOCKET sockConn = accept(sockSrv, (SOCKADDR*)&addrClient, &len);
char sendBuf[50];
sprintf(sendBuf, "Welcome %s to here!", inet_ntoa(addrClient.sin_addr));
send(sockConn, sendBuf, strlen(sendBuf) + 1, MSG_NOSIGNAL);
char recvBuf[50];
recv(sockConn, recvBuf, 50, 0);
printf("%s\n", recvBuf);
closesocket(sockConn);
}
WSACleanup();
return 0;
}
```
请注意,这只是一种可能的解决方案,您可能需要根据您的实际情况进行修改。同时,建议您仔细阅读 Winsock2 文档,以了解如何正确使用 Winsock2 库。
阅读全文