winsockでTCPしたい
- リンクする際、最後に
-lws2_32
が必要(mingwのg++でコンパイルするなら、ソースコードの後にこのライブラリ足さないといけない) - ソケット張りっぱなしにしてチャットみたいな相互通信する場合は、区切り文字で受信データの切れ目探さないといけない
- モダンな言語の標準ライブラリがいかに簡単にソケット扱えるようにラップされてるかを思い知る
g++ -static -DUNICODE socket.cpp -lws2_32
参考
require "socket" | |
s = TCPSocket.open("localhost", 9000) | |
s.puts "hello!" | |
s.close |
winsockでTCPしたい
-lws2_32
が必要(mingwのg++でコンパイルするなら、ソースコードの後にこのライブラリ足さないといけない)g++ -static -DUNICODE socket.cpp -lws2_32
参考
#include <winsock2.h> | |
#include <stdio.h> | |
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { | |
WSADATA wsaData; | |
SOCKET server; | |
struct sockaddr_in serverConf; | |
struct sockaddr_in clientInfo; | |
int len; | |
SOCKET client; | |
char buf[128]; | |
WSAStartup(MAKEWORD(2, 0), &wsaData); | |
server = socket(AF_INET, SOCK_STREAM, 0); | |
if (server == INVALID_SOCKET) { | |
printf("initialization failure: %d\n", WSAGetLastError()); | |
return 1; | |
} | |
serverConf.sin_family = AF_INET; | |
serverConf.sin_port = htons(9000); | |
serverConf.sin_addr.S_un.S_addr = INADDR_ANY; | |
bind(server, (struct sockaddr *)&serverConf, sizeof(serverConf)); | |
listen(server, 5); | |
len = sizeof(clientInfo); | |
client = accept(server, (struct sockaddr *)&clientInfo, &len); | |
memset(buf, 0, sizeof(buf)); | |
int size = recv(client, buf, sizeof(buf), 0); | |
printf("%d\n%s\n", size, buf); | |
closesocket(client); | |
WSACleanup(); | |
return 0; | |
} |