windows和linux之间能用socket套接字实现传输吗?

海浪小强 2013-06-13 12:01:42
请问,客户端程序在windows下用MFC写的,服务端在linux下写的,服务端和客户端之间可以用SOCKET连接吗?
我的程序,通讯连接不起来,客户端程序:
char  buf[255];
memset(buf,0,255);
WSADATA wsaData;
SOCKET s;
SOCKADDR_IN ServerAddr;
int Port = 20000; //初始化Windows Socket 2.2
if(WSAStartup(MAKEWORD(2,2), &wsaData)!=0)
{
AfxMessageBox("套接字第一部就不对");
return -1;
}
// 创建一个新的Socket来连接服务器
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
// 填写客户端地址信息 // 端口为2000
// 服务器IP地址为"192.168.1.16",注意使用inet_addr将IP地址转换为网络格式
ServerAddr.sin_family = AF_INET;
ServerAddr.sin_port = htons(Port);
ServerAddr.sin_addr.s_addr = inet_addr("192.168.1.16");
memset(ServerAddr.sin_zero,0x00,8);

// 向服务器发出连接请求
int n = connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr));
if (n == SOCKET_ERROR)
{
AfxMessageBox("建立不了连接");
}
// 新的连接建立后,就可以互相通信了,在这个简单的例子中,我们直接关闭连接,
int nlength = recv(s,buf,255,0);
CString strMessage(buf);
AfxMessageBox(strMessage);
// 并关闭监听Socket,然后退出应用程序
closesocket(s); // 释放Windows Socket DLL的相关资源
WSACleanup();

服务器端程序:

#include < stdio.h >

#include < sys / socket.h >

#include < unistd.h >

#include < sys / types.h >

#include < netinet / in .h >

#include < stdlib.h >

#include < time.h >



#define SERVER_PORT 20000 // define the defualt connect port id

#define LENGTH_OF_LISTEN_QUEUE 10 // length of listen queue in server

#define BUFFER_SIZE 255

#define WELCOME_MESSAGE "welcome to connect the server. "





int main( int argc, char ** argv)

{

int servfd,clifd;

struct sockaddr_in servaddr,cliaddr;



if ((servfd = socket(AF_INET,SOCK_STREAM, 0 )) < 0 )

{

printf( " create socket error!/n " );

exit( 1 );

}

bzero( & servaddr, sizeof (servaddr));

servaddr.sin_family = AF_INET;

servaddr.sin_port = htons(SERVER_PORT);

servaddr.sin_addr.s_addr = htons(INADDR_ANY);



if (bind(servfd,( struct sockaddr * ) & servaddr, sizeof (servaddr)) < 0 )

{

printf( " bind to port %d failure!/n " ,SERVER_PORT);

exit( 1 );

}



if (listen(servfd,LENGTH_OF_LISTEN_QUEUE) < 0 )

{

printf( " call listen failure!/n " );

exit( 1 );

}



while ( 1 )

{ // server loop will nerver exit unless any body kill the process

char buf[BUFFER_SIZE];

long timestamp;

socklen_t length = sizeof (cliaddr);

clifd = accept(servfd,( struct sockaddr * ) & cliaddr, & length);

if (clifd < 0 )

{

printf( " error comes when call accept!/n " );

break ;

}

strcpy(buf,WELCOME_MESSAGE);

// inet_ntop(INET_ADDRSTRLEN,cliaddr.sin_addr,buf,BUFFER_SIZE);



printf( " from client,IP:%s,Port:%d/n " ,inet_ntoa(cliaddr.sin_addr),ntohs(cliaddr.sin_port));

timestamp = time(NULL);

strcat(buf, " timestamp in server: " );

strcat(buf,ctime( & timestamp));

send(clifd,buf,BUFFER_SIZE, 0 );

close(clifd);



} // exit

close(servfd);

return 0 ;

}

请问为什么这2个建立不起连接呢?客户端连接服务端,connect返回-1,linux运行在虚拟机上。
...全文
777 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
代码上没有发现太大的问题。 你试试: 1、你先用ping命令看看通不通。 2、你在服务器上用netstat命令看看端口是否处于listening状态。 3、你吧connect的错误码打印出来看看,不是connect()的返回值,是WSAGetLastError()这个函数的返回值。
cylz26 2013-07-09
  • 打赏
  • 举报
回复
楼主搞定了分享一下,我遇到相同的情况,关闭防火墙还是一样
just_soso888 2013-06-17
  • 打赏
  • 举报
回复
Ip协议不是哪个系统特有的。
Damn_boy 2013-06-17
  • 打赏
  • 举报
回复
网络字节序要注意一下 其他的没什么了吧
青松2 2013-06-17
  • 打赏
  • 举报
回复
辰岡墨竹 2013-06-16
  • 打赏
  • 举报
回复
你用telnet连接那个端口试试。说不定是服务器配置了防火墙什么的。如果是Red Hat/Fedora的,需要到system-config-firewall放开端口。
take_520 2013-06-16
  • 打赏
  • 举报
回复
当然可以了..现在服务器好多都用Linux了 而PC平台主流还是Windows 如果连最基本的都讯都不行 那岂不是世界大乱了
  • 打赏
  • 举报
回复
必须能啊 不然你怎么用QQ啊 网络协议的存在就是为了实现异种系统的连接
华美乐章 2013-06-13
  • 打赏
  • 举报
回复
打印日志什么的?调试 看看程序在哪里挂了
  • 打赏
  • 举报
回复
socket 本来就是跨平台的
Eleven 2013-06-13
  • 打赏
  • 举报
回复
可以的~~~
傻X 2013-06-13
  • 打赏
  • 举报
回复
肯定可以,我一直这么干 检查 1.防火墙 2.端口信任
zybjtu 2013-06-13
  • 打赏
  • 举报
回复
你先看看ping的通不
这不是鸭头 2013-06-13
  • 打赏
  • 举报
回复
网络通信是不分平台的互通。
海浪小强 2013-06-13
  • 打赏
  • 举报
回复
客户端能ping 通服务器,端口我换了一个,还是不连不上。 客户端的代码是在“int n = connect(s, (SOCKADDR *) &ServerAddr, sizeof(ServerAddr)); ”总是返回-1;

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧