网络编程之windows/Linux比较

    在公司编了快半年的网络程序,在WinCE下,Ubuntu下来回移植,WinCE和Windows还是没有什么太大的区别的,无非是注意下内存泄露的问题,主要是Win和Linux的有关网络的库文件不一样,所以导致了同样是C、C++,两者之间有很大的区别,废话不多说,总结下我遇到的差异(顺序为Windows -> Linux):

    1、头文件:

    #include <winsock.h> or #include <winsock2.h>

    #include <sys/socket.h>

  • 添加#program comment(lib,"Ws2.lib")
  • 默认windows.h文件会包含winsock.h,当你包含winsock2.h就会冲突。要解决这个问题,需要首先包含winsock2.h,然后再包括windows.h,要注意包含的顺序。

    2、socket初始化与关闭:

    Windows需要 WSAStartup(),closesocket(...)函数

    Linux不需要初始化,结束socket用close(...)

    3、类型声明:

    SOCKET

    int

  • 在Windows里将SOCKET宏定义成unsigned int

    4、错误返回码:

    windows下getlasterror()/WSAGetLastError()/SOCKET_ERROR

    linux下errno变量

  • SOCKET_ERROR=-1

    5、设置非阻塞:

    ioctlsocket(server_socket,FIONBIO,&ul);

    ioctlsocket在Linux中没有定义,用fcntl替代即可,但要包含fcntl.h头文件。

    #include <fcntl.h>

    fcntl(server_socket,F_SETFL, O_NONBLOCK);

    6、send函数最后一个参数:

    windows下一般设置为0 

    linux下最好设置为MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。如果不设置,在发送出错后有可能会导致程序退出。

    先总结这么多吧,socket编程是网络编程中比较重要的一个部分,对理解TCP/IP协议也有一定的帮助。当然,如果是通信的朋友仅仅知道socket是远远不够的,它封装了协议的具体实现,所以,我希望有兴趣的朋友深入分析一下socket内部实现,我相信一定会对网络协议有更深入的理解。

    还有想说说程序移植问题,windows和WinCE就不多说了,它们出于同门,自然有千着丝万缕的联系,偶有不同也就是由于系统简化和内存限制的问题。windows和Linux就不一样了,从内核到函数,有着太多的不一样,但是,这不妨碍聪明的人们在两个系统平台上进行移植操作,也在互联网上总结了无数的精华文章。当遇到移植问题,系统不兼容的问题的时候,一定要坚持,网上找解决方法,那你就站在巨人的肩膀上,如果自己找到答案那你就是那个巨人!与君共勉!

分享到:
  最后修改于 2010-03-19   阅读( 102) 评论(1)
上一篇: 上一篇(锁定) 下一篇:tc -help

在此新年之际,,向你问个好,办事处处顺,生活步步高,好运天天交,越长越俊俏,家里出黄金,墙上长钞票,还要天天笑。

(手机看博客)


共1页  |  第一页 上一页 1 下一页 最末页
由于最近广告泛滥,暂只允许登录用户对此文评论。 登录
客户端: #include #include // 包含套接字函数库 #include #include // 包含AF_INET相关结构 #include // 包含AF_INET相关操作的函数 #include #include #include #define PORT 6789 #define IP_ADDR "127.0.0.1" #define SIZE 10240 int main() { struct tm *timeptr; time_t timeval; //时间变量 char tm[50]; int sockfd; // 用于保存客户套接字标识符 int len; // 用于客户消息长度 struct sockaddr_in address; // 定义客户套接字地址结构体 int result; sockfd = socket(AF_INET,SOCK_STREAM, 0); // 定义套接字类型 address.sin_family = AF_INET; // 定义套接字地址中的域 address.sin_addr.s_addr = htonl(INADDR_ANY); address.sin_addr.s_addr = inet_addr(IP_ADDR); // 定义套接字地址 address.sin_port = htons(PORT); // 定义套接字端口 char buf[100]; // 定义要传送的消息 memset(buf,0,100); char str[90]; //存贮输入的语句 char shmaddr[SIZE]; //接受服务器发送的全部聊天数据 int i=0; char myname[100]; char say[10]={"说:"}; printf("欢迎来到聊天室,请输入你的姓名:"); scanf("%s",myname); len = sizeof(address); result = connect(sockfd, (struct sockaddr *) &address, len); // 请求连接 if (result == -1) { perror("Connect failed"); return 1; } printf("%s成功登录服务器:\n",myname); pid_t pid; pid=fork(); if(pid==-1) { printf("fork failed"); } int sendbytes=0; if(pid==0) //子进程用于发送数据 { while(1) { scanf("%s",str); (void)time(&timeval); strcpy(tm,ctime(&timeval)); strcpy(buf,myname); //姓名传入buf中 strcat(buf,":"); strcat(buf,str); strcat(buf," ["); strc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值