我有關於併發網絡編程的理論問題。我正在嘗試創建一個客戶端網絡工具,並且我需要它非常快速地執行。該程序將從文本文件中讀取IP地址列表並在其上運行一些功能。這個功能例如:從文本文件中讀取字符串並將它們同時發送到服務器
void conn(char *host, const char *port, char *test_string)
{
struct addrinfo *res;
struct addrinfo hints;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
getaddrinfo(host, port, &hints, &res);
int s = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
if (s == -1) error("failed to open socket");
int c = connect(s, res->ai_addr, res->ai_addrlen);
// send string from file
// recv message
freeaddrinfo(res);
}
我想同時向服務器發送請求以獲得更好的性能,但我不明白我應該如何完全做到這一點。我已經做了研究與POSIX線程的多線程,但我不能拿出的東西,實際上似乎運行異步
while (fgets(buf, sizeof(buf), stringlist)) {
if ((c = strchr(buf, '\n')) != NULL)
*c = '\0';
strncpy(args.test, buf, 20);
pthread_create(&threads, NULL, conn, &args);
pthread_join(threads, &res);
}
}
我意識到,肯定不會以任何方式提高性能,我已經做了進一步的研究,但我開始感到失落。我知道使用fcntl使套接字非阻塞和異步,以及I/O多路複用的選擇功能,但我不知道哪種方法是正確的在這種情況下。
我的問題簡而言之是:什麼是從文本文件中讀取字符串並將包含字符串的併發請求發送到服務器的好方法。多線程適合這種情況嗎?
當你調用'pthread_join'時,程序一直等到線程結束。所以循環創建一個線程,等待它完成,然後讀取下一行。 – user3386109