WindowsとLinux SOCKET通信

3650 ワード

windows client   



// Def_win_client_socket_test.cpp :              。

//



#include "stdafx.h"

#include <windows.h>



#pragma comment(lib,"ws2_32.lib")

#define PORT 4000

#define IP_ADDRESS "192.168.227.136"





int _tmain(int argc, _TCHAR* argv[])

{

WSADATA Ws;

SOCKET ClientSocket;

struct sockaddr_in ClientAddr;

int Ret = 0;

char SendBuffer[MAX_PATH];



if(WSAStartup(MAKEWORD(2,2),&Ws) != 0)

{

printf("Init winows socket failed::%d",GetLastError());

return -1;

}

// 0           

ClientSocket = socket(AF_INET,SOCK_STREAM,0);



ClientAddr.sin_family = AF_INET;

ClientAddr.sin_addr.S_un.S_addr=inet_addr(IP_ADDRESS); 

ClientAddr.sin_port=htons(PORT); 



printf("Connect to server...
"); Ret = connect(ClientSocket,(struct sockaddr*)&ClientAddr, sizeof(ClientAddr)); if( Ret == SOCKET_ERROR) { printf("Connect Error::%d
",GetLastError()); return -1; }else { printf("Connect succeded!
"); } while(1) { scanf("%s", SendBuffer); /* send data to server */ Ret = send(ClientSocket, SendBuffer, (int)strlen(SendBuffer), 0); if ( Ret == SOCKET_ERROR ) { printf("Send Info Error::%d
", GetLastError()); break; } if('q' == SendBuffer[0]) { break; } } closesocket(ClientSocket); WSACleanup(); return 0; }

 
作成した小さなプログラムはネットワーク上のいくつかの文章を参考にしていますが、ネットワーク上のコードは本機に設定されているようで、windowsクライアント側で修正しました.
linux server   

#include <netinet/in.h> 

#include <sys/types.h> 

#include <sys/socket.h> 

#include <stdio.h> 

#include <stdlib.h> 

#include <string.h> 



#define HELLO_WORLD_SERVER_PORT 4000

#define LENGTH_OF_LISTEN_QUEUE 20

#define BUFFER_SIZE 1024



int main(int argc, char **argv)

{

struct sockaddr_in server_addr;

int server_socket;

int opt = 1;



bzero(&server_addr,sizeof(server_addr)); 



server_addr.sin_family = AF_INET;

server_addr.sin_addr.s_addr = htons(INADDR_ANY);

server_addr.sin_port = htons(HELLO_WORLD_SERVER_PORT);



/* create a socket */

server_socket = socket(PF_INET,SOCK_STREAM,0);

if( server_socket < 0)

{

printf("Create Socket Failed!");

exit(1);

}



/* bind socket to a specified address*/

setsockopt(server_socket, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

if( bind(server_socket,(struct sockaddr*)&server_addr,sizeof(server_addr)))

{

printf("Server Bind Port : %d Failed!", HELLO_WORLD_SERVER_PORT); 

exit(1);

}



/* listen a socket */

if(listen(server_socket, LENGTH_OF_LISTEN_QUEUE))

{

printf("Server Listen Failed!"); 

exit(1);

}



/* run server */

while (1) 

{

struct sockaddr_in client_addr;

int client_socket; 

socklen_t length;

char buffer[BUFFER_SIZE];



/* accept socket from client */

length = sizeof(client_addr);

client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &length);

if( client_socket < 0)

{

printf("Server Accept Failed!
"); break; } /* receive data from client */ while(1) { bzero(buffer, BUFFER_SIZE); length = recv(client_socket, buffer, BUFFER_SIZE, 0); if (length < 0) { printf("Server Recieve Data Failed!
"); break; }else if (length < 0) { printf("Recv Buffer is %s
",buffer); break; } if('q' == buffer[0]) { printf("Quit from client!
"); break; } printf("%s
", buffer); } close(client_socket); } close(server_socket); return 0; }

ubuntu仮想マシン12.06バージョンとwindows 7でテストに合格