Socket相关程序:从Windows移植到Linux

socket相关程序从windows移植到linux下需要注意的

1)头文件

windows下winsock.h/winsock2.h

linux下netinet/in.h(大部分都在这儿),unistd.h(close函数在这儿),sys/socket.h(在in.h里已经包含了,可以省了)

错误处理:errno.h

2)初始化

windows下需要用WSAStartup并且要用#pragma comment(lib,"Ws2_32")来告知编译器链接该lib。

linux下不需要

3)关闭socket

windows下closesocket(...)

linux下close(...)

4)类型

windows下SOCKET

linux下int

如我用到的一些宏:

#ifdef WIN32

typedef int socklen_t;

typedef int ssize_t;

#endif

#ifdef __LINUX__

typedef int SOCKET;

typedef unsigned char BYTE;

typedef unsigned long DWORD;

#define FALSE 0

#define SOCKET_ERROR (-1)

#endif

5)获取错误码

windows下getlasterror()/WSAGetLastError()

linux下errno变量

6)设置非阻塞

windows下ioctlsocket()

linux下fcntl()需要头文件fcntl.h

7)send函数最后一个参数

windows下一般设置为0

linux下最好设置为MSG_NOSIGNAL,如果不设置,在发送出错后有可 能会导致程序退出。

8)毫秒级时间获取

windows下GetTickCount()

linux下gettimeofday()

多线程

多线程: (win)process.h --〉(linux)pthread.h

_beginthread --> pthread_create

_endthread --> pthread_exit

10)用IP定义一个地址(sockaddr_in的结构的区别)
windows下addr_var.sin_addr.S_un.S_addr
linux下addr_var.sin_addr.s_addr
而且Winsock里最后那个32bit的S_addr也有几个以联合(Union)的形式与它共享内存空间的成员变量(便于以其他方式赋值),而Linux的Socket没有这个联合,就是一个32bit的s_addr。遇到那种得到了是4个char的IP的形式(比如127一个,0一个,0一个和1一个共四个char),WinSock可以直接用4个S_b来赋值到S_addr里,而在Linux下,可以用边向左移位(一下8bit,共四下)边相加的方法赋值。

11)异常处理
linux下当连接断开,还发数据的时候,不仅send()的返回值会有反映,而且还会像系统发送一个异常消息,如果不作处理,系统会出BrokePipe,程序会退出。为此,send()函数的最后一个参数可以设MSG_NOSIGNAL,禁止send()函数向系统发送异常消息。



客户端: #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
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值