Skip to content

Instantly share code, notes, and snippets.

@kikuchy
Created June 18, 2018 09:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kikuchy/25d8efad6df987c4e24a3e3548845e67 to your computer and use it in GitHub Desktop.
Save kikuchy/25d8efad6df987c4e24a3e3548845e67 to your computer and use it in GitHub Desktop.
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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment