Windows服务器与Linux客户机使用TCP协议进行数据传输

Windows服务器:

// TCPServer.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <WINSOCK2.H> 
#include <iostream>
#pragma comment(lib,"WS2_32.lib") 
#define BUF_SIZE 64 // 缓冲区大小


int _tmain(int argc, _TCHAR* argv[])
{
WSADATA wsd; // WSADATA变量,用于初始化Windows Socket 
SOCKET sServer; // 服务器套接字,用于监听客户端请求
SOCKET sClient; // 客户端套接字,用于实现与客户端的通信 
int retVal; // 调用各种Socket函数的返回值 
char buf[BUF_SIZE]; // 用于接受客户端数据的缓冲区 
// 初始化套接字动态库 
if(WSAStartup(MAKEWORD(2,2),&wsd) != 0) 

printf("WSAStartup failed !\n"); 
return 1; 
}


// 创建用于监听的套接字 
sServer = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); 
if(INVALID_SOCKET == sServer) 

printf("socket failed !\n"); 
WSACleanup(); 
return -1; 
}


// 设置服务器套接字地址 
SOCKADDR_IN addrServ; 
addrServ.sin_family = AF_INET; 
addrServ.sin_port = htons(8888); // 监听端口为9990
addrServ.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 
// 绑定套接字sServer到本地地址,端口9990 
retVal = bind(sServer,(const struct sockaddr*)&addrServ,sizeof(SOCKADDR_IN)); 
if(SOCKET_ERROR == retVal) 

printf("bind failed !\n"); 
closesocket(sServer); 
WSACleanup(); 
// return -1; 

// 监听套接字 
retVal = listen(sServer,1); 
if(SOCKET_ERROR == retVal) 

printf("listen failed !\n"); 
closesocket(sServer); 
WSACleanup(); 
// return -1; 

// 接受客户请求 
printf("TCP Server start...\n");
sockaddr_in addrClient; // 客户端地址
int addrClientlen = sizeof(addrClient); 
sClient = accept(sServer,(sockaddr FAR*)&addrClient,&addrClientlen); 
if(INVALID_SOCKET == sClient) 

printf("accept failed !\n"); 
closesocket(sServer); 
WSACleanup(); 
// return -1; 

// 循环接收客户端的数据,直接客户端发送quit命令后退出。 
while(true)
{
ZeroMemory(buf,BUF_SIZE); // 清空接收数据的缓冲区
retVal = recv(sClient,buf,BUFSIZ,0); // 
if(SOCKET_ERROR == retVal) 

printf("recv failed !\n"); 
closesocket(sServer); 
closesocket(sClient); 
WSACleanup(); 
return -1; 

// 获取当前系统时间
SYSTEMTIME st;
GetLocalTime(&st);
char sDateTime[30];
sprintf(sDateTime, "%4d-%2d-%2d %2d:%2d:%2d",st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond);
// 打印输出的信息
printf("%s, Recv From Client [%s:%d] :%s\n", sDateTime, inet_ntoa(addrClient.sin_addr), addrClient.sin_port, buf); 
// 如果客户端发送quit字符串,则服务器退出
if(strcmp(buf, "quit") == 0)
{
retVal = send(sClient,"quit",strlen("quit"),0); 
break;
}
else // 否则向客户端发送回显字符串
{
char msg[BUF_SIZE]; 
sprintf(msg, "Message received - %s", buf); 
retVal = send(sClient, msg, strlen(msg),0); 
if(SOCKET_ERROR == retVal) 

printf("send failed !\n"); 
closesocket(sServer); 
closesocket(sClient); 
WSACleanup(); 
return -1; 

}
}
// 释放套接字 
closesocket(sServer); 
closesocket(sClient); 
WSACleanup(); 
// 暂停,按任意键退出
system("pause");
return 0;
//memset(&buf,0,sizeof(buf));
}



Linux客户机:

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <signal.h>
extern void sig_proccess(int signo);
extern void sig_pipe(int signo);
static int s;
void sig_proccess_client(int signo) /*客户端信号处理回调函数*/
{
printf("Catch a exit signal\n"); /*打印信息*/
close(s); /*关闭套接字*/
exit(0); /*退出程序*/
}
#define PORT 8888 /*侦听端口地址*/
int main(int argc, char*argv[])
{
struct sockaddr_in server_addr; /*服务器地址结构*/
int err; /*返回值*/

if(argc == 1){
printf("PLS input server addr\n");
return 0;
}
signal(SIGINT, sig_proccess); /*挂接SIGINT信号,处理函数为  sig_process()*/
signal(SIGPIPE, sig_pipe); /*挂接SIGPIPE信号,处理函数为sig_pipe()*/

s = socket(AF_INET, SOCK_STREAM, 0); /*建立一个流式套接字*/
if(s < 0){ /*建立套接字出错*/
printf("socket error\n");
return -1;
}

/*设置服务器地址*/
bzero(&server_addr, sizeof(server_addr)); /*将地址结构清零*/
server_addr.sin_family = AF_INET; /*将协议族设置为AF_INET*/
//server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_addr.s_addr = inet_addr("192.168.19.152"); /*IP地址为本地任意IP地址*/
server_addr.sin_port = htons(PORT); /*设置服务器端口为8888*/

inet_pton(AF_INET, argv[1], &server_addr.sin_addr);
/*将用户输入的字符串类型的IP地址转为整型*/
connect(s, (struct sockaddr*)&server_addr, sizeof(struct sockaddr));
/*连接服务器*/
process_conn_client(s); /*客户端处理过程*/
close(s); /*关闭连接*/
}

******/*客户端的处理过程*/
void process_conn_client(int s)
{
ssize_t size = 0;
char buffer[1024]; /*数据的缓冲区*/

for(;;){ /*循环处理过程*/
size = read(0, buffer, 1024);
/*从标准输入中读取数据放到缓冲区buffer中*/
if(size > 0){ /*读到数据*/
send(s, buffer, size,0); /*发送给服务器*/
size = recv(s, buffer, 1024,0); /*从服务器读取数据*/
write(1, buffer, size); /*写到标准输出*/
}
}
}


/*信号SIGINT的处理函数*/
void sig_proccess(int signo)
{
printf("Catch a exit signal\n");
_exit(0);
}


/*信号SIGPIPE的处理函数*/
void sig_pipe(int sign)
{
printf("Catch a SIGPIPE signal\n");

/*释放资源*/
}*******************客户端处理过程**********************************


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值