我想寫一個基本的套接字應用程序,它將接受來自客戶端的字符串,並對我在內存中的數據結構做一些工作。我正在嘗試使用C++ 11,因爲我想爲多線程提供語言支持,並且發現了一個奇怪的問題。我有代碼在端口1234上創建偵聽套接字,並接受一個連接,打印出一個虛擬字符串並將其關閉。如果我與編譯:聽套接字工作在g ++只有-std = c + + 11
g++ -o socket_test socket_test.cpp
它完美,但如果我與編譯:
g++ -std=c++11 -o socket_test socket_test.cpp
它編譯並運行正常,但如果我嘗試連接到端口它會在連接被拒絕後反彈回來。測試代碼是在這裏:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
using namespace std;
int main()
{
cout << "Hello world, I'm going to open a socket on port 1234 now!" << endl;
int m_socket = 0;
int m_client = 0;
int port = 1234;
sockaddr_in serv_addr, client_addr;
socklen_t client_len;
m_socket = socket(AF_INET, SOCK_STREAM, 0);
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = INADDR_ANY;
serv_addr.sin_port = htons(port);
bind(m_socket, (struct sockaddr *)&serv_addr, sizeof(serv_addr));
cout << "Listen returns: " << listen(m_socket, SOMAXCONN) << endl;
m_client = accept(m_socket, (struct sockaddr *)&client_addr, &client_len);
write(m_client, "Numa numa\n", 10);
close(m_client);
close(m_socket);
return 0;
}
我的編譯環境是OSX 10.9.2,使用G ++如下:
battra:socket_test matt$ g++ --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr
--with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/
MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/include/c++/4.2.1
Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn)
Target: x86_64-apple-darwin13.2.0
Thread model: posix
battra:socket_test matt$
請了解*返回值檢查和錯誤處理*。在不可代碼的代碼上浪費時間毫無意義。 –
這是一個精簡的測試版本,完整的代碼行爲相同,並檢查所有返回值,沒有錯誤代碼出現。我也在調用listen()之後在端口上添加了一個打印輸出,並且C++ 11版本始終是上面60000s中隨機分配的端口,另一個版本始終是端口1234.所以這似乎是問題所在,我仍然不確定爲什麼bind()在兩個版本之間抓住不同的端口。 –