[英]"Error Setting TCP Socket Options" error with setsockopt()
此片段取自server.c
,它應該從客戶端計算機接收數據:
int main() {
int sock, client_socket;
char buffer[1024];
char response[18384];
struct sockaddr_in server_address, client_address;
int i = 0;
int optval = 1;
socklen_t client_length;
sock = socket(AF_INET, SOCK_STREAM, 0);
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *) &optval, sizeof(optval)) < 0) {
printf("Error Setting TCP Socket Options!\n");
return 1;
}
server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("10.0.0.188");
server_address.sin_port = htons(12345);
bind(sock, (struct sockaddr *) &server_address, sizeof(server_address));
listen(sock, 5);
client_length = sizeof(client_address);
client_socket = accept(sock, (struct sockaddr *) &client_address, &client_length);
When I compile and run this on Kali Linux, it sets the TCP socket fine and works, but when I compile and run this on Windows with gcc gcc server.c -o server.exe -lws2_32
, I get the error message from setsockopt()
:
設置 TCP 插座選項時出錯!
此代碼段下方是bind()
和listen()
function,以及決定如何處理從客戶端接收到的數據的if/else
塊。
在 Windows 上,您必須在使用任何其他套接字函數之前調用WSAStartup()
(並在退出之前使用 Winsock 庫時調用WSACleanup()
)。 其他平台沒有類似的功能來初始化/清理他們的套接字庫。
而且,您應該始終檢查套接字函數(或任何系統調用)的返回值是否失敗,並使用WSAGetLastError()
(在其他平台上為errno
)來檢索錯誤代碼給 tel,了解函數失敗的原因。
您沒有檢查socket()
是否失敗(這將報告WSANOTINITIALISED
錯誤),因此您將無效的套接字傳遞給setsockopt()
(這將報告WSAENOTSOCK
錯誤)。
嘗試這個:
int main() {
WSADATA wsa;
SOCKET sock, ...;
...
BOOL optval = TRUE;
...
int err = WSAStartup(MAKEWORD(2,0), &wsa);
if (err != 0) {
printf("Error Initializing WinSock! Error: %d\n", err);
return 1;
}
sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == INVALID_SOCKET) {
err = WSAGetLastError();
printf("Error Creating TCP Socket! Error: %d\n", err);
WSACleanup();
return 1;
}
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (const char *) &optval, sizeof(optval)) < 0) {
err = WSAGetLastError();
printf("Error Setting TCP Socket Options! Error: %d\n", err);
closesocket(sock);
WSACleanup();
return 1;
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.