您的位置:首页 > 运维架构 > Linux

Windows系统和Linux系统的Socket通信解决方案或问题

2014-03-26 22:41 204 查看

因为项目的需要,希望使用windows系统作为客户端,模拟想Linux系统的服务端发送数据。在这个过程当中,遇到了一些问题,所以记录下来。

环境说明:
客户端
系统:windows系统,语言:C语言
服务端
系统:CentOS系统(LInux系统),语言:C语言
虚拟机:VMWare 10

windows系统的客户端:

#include <stdio.h>

#include <Windows.h>

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

#define PORT 4000

#define IP_ADDRESS "192.168.1.128"

int main(int argc, char* argv[])

{

WSADATA Ws;

SOCKET ClientSocket;

struct sockaddr_in ClientAddr;

int Ret = 0;

char SendBuffer[MAX_PATH];

/* Init Windows Socket */

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

{

printf("Init Windows Socket Failed::%d\n", GetLastError());

return -1;

}

/* Create Socket */

ClientSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if ( ClientSocket == INVALID_SOCKET )

{

printf("Create Socket Failed::%d\n", GetLastError());

return -1;

}

ClientAddr.sin_family = AF_INET;

ClientAddr.sin_addr.s_addr = inet_addr(IP_ADDRESS);

ClientAddr.sin_port = htons(PORT);

memset(ClientAddr.sin_zero, 0x00, 8);

/* connect socket */

Ret = connect(ClientSocket,(struct sockaddr*)&ClientAddr, sizeof(ClientAddr));

if ( Ret == SOCKET_ERROR )

{ printf("Connect Error::%d\n", GetLastError());

return -1;

}

else

{

printf("Connect succedded!\n");

}

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\n", GetLastError());

break;

}

if('q' == SendBuffer[0])

{

break;

}

}

/* close socket */

closesocket(ClientSocket);

WSACleanup();

return 0;

}

Linux系统的服务端:

#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!\n");

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!\n");

break;

}

if('q' == buffer[0])

{

printf("Quit from client!\n");

break;

}

printf("%s\n", buffer);

}

close(client_socket);

}

close(server_socket);

return 0;

}

可能存在的问题:

1、虚拟机选择NAT模式连接网络
2、关闭Linux系统的防火墙,否则Windows不能够连接Linux
(1) 重启后永久性生效: 开启:chkconfig iptables on 关闭:chkconfig iptables off
(2) 即时生效,重启后失效: 开启:service iptables start 关闭:service iptables stop
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: