Windows Socket和Linux Socketstm32f4与f1编程区别的区别

socket相关程序从Windows移植到Linux下需要注意的:
1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h
2)初始化 Windows下需要用WSAStartup 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()
3、多线程 多线程: (win)process.h --〉(Linux)pthread.h _beginthread --& pthread_create _endthread --& pthread_exit
一、下的socket编程:
1、客户端执行步骤依次如下:
send()或者recv()
注意的是,connect之前要填充地址结构体,IP地址转换为网络字节序,一般用inet_aton().
recv()或者send()
(ps:一般通过将send()和recv()的最后一个参数赋为0或者1来区分阻塞与非阻塞,其中0对应阻塞,1对应非阻塞)
二、windows下的网络编程:
做过windows网络编程的人都知道,微软的MFC把复杂的WinSock API函数封装到类里,这使得编写网络应用程序更容易。即windows既提供上层的网络API函数也提供底层的API函数。
1、对于采用上层的API函数而言:若采用csocket类定义一个对象obj的话,那么进行网络编程的步骤如下:
obj.Create()
obj.Connect()
obj.Receive()或者obj.Send()
obj.Close()
先调用AfxSocketInit()检测协议栈安装情况
obj.Create()
obj.Listen()
obj.Accpet()
obj.Receive()或者obj.Send()
obj.Close()
2、对于采用底层的API函数而言,步骤如下:
WSAStartup()
send()或者recv()
closesocket()
服务器端:
WSAStartup()socket()bind()listen()accpet()send()recv()closesocket()
(ps:windows下CSocket类为同步方式,有阻塞现象;CASyncSocket为异步方式,无阻塞现象。)
通过以上比较可以发现:下的网络编程与windows下采用底层的API类似,但是也有区别:
区别一:windows下需加上WSAStartup()函数
区别二:关闭socket:linux为close(),windows为closesocket()
windows下采用上层的API,一般有CSocket和CAsynSocket这两种类型的类
这种情况以下socket函数一般的首字母大写。而底层的API不管是windows下的还是linux下的socket函数首字母都是小写的。
原文链接:
/lcryby/articles/2227440.html
阅读(...) 评论()这篇博文可不是为了讲socket编程的哦,socket只是一个工具被我使用而已。
从很久以后就在想,编程能干什么呢?后来才想明白,编程是为了解决问题的,给人一种方便。每次看着女朋友使用着他们的工程计算软件的时候,我就会想起,这就是编程给予的好处,让她摆脱了用手去计算建筑工程...
可是作为一个程序员我其实一直都没有很好的体现出这一点,出现很多的问题的时候,总是都将就着过,犹如做一天和尚撞一天钟,能将就就将就着过。其实有一句话说的好最好的程序员也就是最懒惰的程序员,能用计算机实现的何必需要人力去完成呢。所以做为一个程序员我觉得首先你要有一种精神,就是什么问题都能从自己开始出发,问自己能不能去解决这个问题,或者是尝试去解决这个问题,使用计算机....
大学中我发现我缺乏这样的一种精神,这让我的水平一直处于中等,一直不能有所成长...我想我是缺少这种热情和精神...我要改变这种状况...为此我再次争取了在学校里的学习....我相信我能改变的....
最近一直在学习linux的编程。环境是rhel 5,用虚拟机的形式装着。VM 很强大,不过由于计算机的配置真的很低级,在VM中的rhel5有很多的限制,比如它的网速慢的要死,还有就是没有配置中文等一系列的问题,让我每次碰见问题Google的时候很郁闷。作为一个独立的系统,linux与windows之间不能进行相互的copy,所以有时候在windows搜索linux中碰见的问题就是一件很麻烦的事情,因为不能copy,弄的很多问题要自己去打。这一直让我觉得很麻烦。以前的解决方法是使用linux 的samba这个服务(不知道这个名字对还是不对),哈哈,这个服务是可以让windows通过网络去访问linux的fs,这样好处真的很多,比如有时候linux中的vi没有windows中的gvim用的那么爽,那我就在windows中使用gvim写程序,写完以后就通过这个服务把程序copy到linux的某个目录下。。。。我每次在Linux下创建一个文件,然后每次linux
的问题就copy到这个文件,然后通过samba这个服务让windows去访问这个文件,然后在进行copy。不过这还是一个很麻烦的过程....
不过一次在使用socket for linux的编程中,让我突发奇想到如果我在Linux中运行server这个程序,然后在windows下运行client这个程序,那样不是可以通信了吗..哈哈哈,所以很想早点动手写,不过一直懒的很,不过昨天还是花了点时间去写这个程序。linux在的server程序本来就写好了,可是windows下的client还没写,以前写的是linux的client。不过想想之间的差不多肯定是不大的...所以昨天从网上找了点关于windows socket的资料,也进行了编写。还是很顺利的写完这个client
for windows的程序。windows的socket编程在大体上和Linux的还是差不多的,只是调用的一些函数会有点差别
Linux for server (code)
#include&stdio.h&
#include&stdlib.h&
#include&string.h&
#include&errno.h&
#include&netdb.h&
#include&sys/socket.h&
#include&sys/types.h&
#include&netinet/in.h&
#include&unistd.h&
#define PORT 3335
#define MAX_LEN 1024
typedef struct sockaddr_
int main()
int sin_size = sizeof(addr);
int sockid = 0;
int new_sockid = 0;
addr ser_addr,client_
char bufferw[MAX_LEN];
char bufferr[MAX_LEN];
//create socket
if((sockid = socket(AF_INET,SOCK_STREAM,0)) == -1)
printf(&create socket is failure\n&);
//对ser_addr 进行初始化
bzero(&ser_addr,sizeof(addr));
ser_addr.sin_family = AF_INET;
ser_addr.sin_port = htons(PORT);
ser_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//server bind
if((bind(sockid,(struct sockaddr *)&ser_addr,sizeof(ser_addr))) == -1)
fprintf(stderr,&bind error is %s\n&,strerror(errno));
if(listen(sockid,5) == -1)
fprintf(stderr,&listen error is %s\n&,strerror(errno));
if((new_sockid = accept(sockid,(struct sockaddr*)(&client_addr),&sin_size)) == -1)
fprintf(stderr,&accept error is %s\n&,strerror(errno));
printf(&server and client %s link success!!\n&,inet_ntoa(client_addr.sin_addr.s_addr));
//进行读写
if(fork() == 0)
//在子进程中进行读写操作
fgets(bufferw,MAX_LEN,stdin);
if(write(new_sockid,bufferw,MAX_LEN) == -1)
fprintf(stderr,&write error is %s\n&,strerror(errno));
if(strcmp(bufferw,&end\n&) == 0)
printf(&your talk is over!!\n&);
close(new_sockid);
close(sockid);
printf(&server is over!!\n&);
client for windows
#pragma comment(lib,&wsock32.lib&)
#include&stdio.h&
#include&winsock2.h&
#define PORT 3335
#define MaxLen 1024
typedef struct sockaddr_
int Initsocket(void);
int Initsocket(void)
version = MAKEWORD(2,2);
err = WSAStartup(version,&wsadata);
printf(&Error %d:winsock not avaiable\n&);
int main()
char bufferw[MaxLen];
char bufferr[MaxLen];
addr server_
Initsocket();
if((client = socket(PF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
printf(&no more socket resource\n&);
//服务器地址的初始化
server_add.sin_family = PF_INET;
server_add.sin_port = htons(PORT);
server_add.sin_addr.S_un.S_addr= inet_addr(&192.168.0.2&);
if((err = connect(client,(struct sockaddr*)&server_add,sizeof(addr))) == INVALID_SOCKET)
printf(&error %d:cannot connect to server\n&);
printf(&link server is successful\n&);
recv(client,bufferw,sizeof(bufferw),0);
printf(&server said: %s\n&,bufferw);
if(strcmp(bufferw,&end\n&) == 0)
for(i = 0;bufferw[i] != '\0';i++)
bufferw[i] = '\0';
closesocket(client);
WSACleanup();
这两个程序都很简单的...因为我只要linux传信息过来,所以在server中只是写,在client中只是接收....
这大概是第一次因为自己想要方便才写的程序,呵呵,觉得如果自己一直这样努力下去应该会变成一个不错的coder....很开心...
这里还是要讲一下,windows和Linux的编程我觉得Linux简单的多,你看看我上面的写的两个程序就会发现windows下面写程序有多少乱了。好多的东西是你不熟悉的...Linux的入手会难,那是因为你一开始是使用windows,所以有点先入为主的观点...
如果有同感的话看看这篇文章把...我觉得写得很是那么回事------
本文已收录于以下专栏:
相关文章推荐
INVALID_SOCKET的值
 ( 15:06:45)
标签: 
INVALID_SOCKET的值不...
常用socket函数详解
关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确。每次都查半天,经常烦恼于此。索性都弄...
编程要求:捕获本机网卡的IP包,对捕获的IP包进行解析。要求必须输出以下字段:版本号、总长度、标志位、片偏移、协议、源地址和目的地址。
TCP/IP协议定义了一个在因特网上传输的包,称为IP数据报...
Windows socket 基础
     Windows socket是一套在Windows操作系统下的网络编程接口。它不是一种网络协议,而是一个开放的、支持多个协议的Windows下的网...
Linux利用socket实现两台pc之间的数据传输功能,包括windows到linux
代表要用Ws2_32.lib这个库
gcc编译选项...
//实现两台计算机进行文件传输,包括跨平台传输即linux与windows之间
//TCP的文件传输
//文件大小不限制,需要做到将大文件分包去做
//服务端程序
SOCKET在原理上应该是一样的,只是不同系统的运行机置有些不同。
Socket 编程 windows到Linux代码移植遇到的问题
1、一些常用函数的移植
http://www.vckba...
【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @】     在公司里面,我们平时使用的机器一般都是windows系统,但是开发、编译的机器往往是l...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)socket设置为非阻塞方式(windows和linux)
来源:博客园
Windows用以下方法将socket设置为非阻塞方式 : unsigned long ul=1; SOCKET s=socket(AF_INET,SOCK_STREAM,0); int ret=ioctlsocket(s, FIONBIO, (unsigned long *)&ul); //设置成非阻塞模式。 if (ret==SOCKET_ERROR) //设置失败。 { } Linux用以下方法将socket设置为非阻塞方式 int flags = fcntl(socket, F_GETFL, 0); fcntl(socket, F_SETFL, flags | O_NONBLOCK); 用以下方法将socket设置为非阻塞方式 int flags = fcntl(socket, F_GETFL, 0); fcntl(socket, F_SETFL, flags | O_NONBLOCK); 将非阻塞的设置回阻塞可以用 int flags = fcntl(socket, F_GETFL, 0); fcntl(socket, F_SETFL, flags & ~O_NONBLOCK); 功能描述:根据文件描述词来操作文件的特性。 用法: int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock); 参数: fd:文件描述词。 cmd:操作命令。 arg:供命令使用的参数。 lock:同上。 有以下操作命令可供使用 一. F_DUPFD :复制文件描述词 。 二. FD_CLOEXEC :设置close-on-exec标志。如果FD_CLOEXEC位是0,执行execve的过程中,文件保持打开。反之则关闭。 三. F_GETFD :读取文件描述词标志。 四. F_SETFD :设置文件描述词标志。 五. F_GETFL :读取文件状态标志。 六. F_SETFL :设置文件状态标志。 其中O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_EXCL, O_NOCTTY 和 O_TRUNC不受影响, 可以更改的标志有 O_APPEND,O_ASYNC, O_DIRECT, O_NOATIME 和 O_NONBLOCK。 七. F_GETLK, F_SETLK 和 F_SETLKW :获取,释放或测试记录锁,使用到的参数是以下结构体指针: F_SETLK:在指定的字节范围获取锁(F_RDLCK, F_WRLCK)或者释放锁(F_UNLCK)。如果与另一个进程的锁操作发生冲突,返回 -1并将errno设置为EACCES或EAGAIN。 F_SETLKW:行为如同F_SETLK,除了不能获取锁时会睡眠等待外。如果在等待的过程中接收到信号,会立即返回并将errno置为EINTR。 F_GETLK:获取文件锁信息。 F_UNLCK:释放文件锁。 为了设置读锁,文件必须以读的方式打开。为了设置写锁,文件必须以写的方式打开。为了设置读写锁,文件必须以读写的方式打开。 八. 信号管理 F_GETOWN, F_SETOWN, F_GETSIG 和 F_SETSIG 被用于IO可获取的信号。 F_GETOWN:获取当前在文件描述词 fd上接收到SIGIO 或 SIGURG事件信号的进程或进程组标识 。 F_SETOWN:设置将要在文件描述词fd上接收SIGIO 或 SIGURG事件信号的进程或进程组标识 。 F_GETSIG:获取标识输入输出可进行的信号。 F_SETSIG:设置标识输入输出可进行的信号。 使用以上命令,大部分时间程序无须使用select()或poll()即可实现完整的异步I/O。 九. 租约( Leases) F_SETLEASE 和 F_GETLEASE 被用于当前进程在文件上的租约。文件租约提供当一个进程试图打开或折断文件内容时,拥有文件租约的进程将会被通告的机制。 F_SETLEASE:根据以下符号值设置或者删除文件租约 1.F_RDLCK设置读租约,当文件由另一个进程以写的方式打开或折断内容时,拥有租约的当前进程会被通告。 2.F_WRLCK设置写租约,当文件由另一个进程以读或以写的方式打开或折断内容时,拥有租约的当前进程会被通告。 3.F_UNLCK删除文件租约。 F_GETLEASE:获取租约类型。 十.文件或目录改变通告 (linux 2.4以上)当fd索引的目录或目录中所包含的某一文件发生变化时,将会向进程发出通告。arg参数指定的通告事件有以下,两个或多个值可以通过或运算组合。 1.DN_ACCESS 文件被访问 (read, pread, readv) 2.DN_MODIFY 文件被修改(write, pwrite,writev, truncate, ftruncate) 3.DN_CREATE 文件被建立(open, creat, mknod, mkdir, link, symlink, rename) 4.DN_DELETE 文件被删除(unlink, rmdir) 5.DN_RENAME 文件被重命名(rename) 6.DN_ATTRIB 文件属性被改变(chown, chmod, utime[s]) 返回说明: 成功执行时,对于不同的操作,有不同的返回值 F_DUPFD: 新文件描述词 F_GETFD: 标志值 F_GETFL: 标志值 F_GETOWN: 文件描述词属主 F_GETSIG: 读写变得可行时将要发送的通告信号,或者0对于传统的SIGIO行为 对于其它命令返回0。 失败返回-1,errno被设为以下的某个值 EACCES/EAGAIN: 操作不被允许,尚未可行 EBADF: 文件描述词无效 EDEADLK: 探测到可能会发生死锁 EFAULT: 锁操作发生在可访问的地址空间外 EINTR: 操作被信号中断 EINVAL: 参数无效 EMFILE: 进程已超出文件的最大可使用范围 ENOLCK: 锁已被用尽 EPERM:权能不允许 struct flock { short l_ /* 锁类型: F_RDLCK, F_WRLCK, F_UNLCK */ short l_ /* l_start字段参照点: SEEK_SET(文件头), SEEK_CUR(文件当前位置), SEEK_END(文件尾) */ off_t l_ /* 相对于l_whence字段的偏移量 */ off_t l_ /* 需要锁定的长度 */ pid_t l_ /* 当前获得文件锁的进程标识(F_GETLK) */ }; 原文参考: /Linux/74.htm
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动&>&socket编写windows和linux通讯程序-源码
socket编写windows和linux通讯程序-源码
上传大小:25KB
利用socket编写windows和linux通讯程序(源代码实现)&br&&br& socket编程大家都很熟悉,我在这里就不再罗嗦了。直接切入正题。该程序分两部分,server端和client端(谁都知道)。其中server端采用windows平台,那linux平台当然是client端了.&br&&br&这里是server端程序:&br>include &windows.h&&br&#include &stdio.h&&br&#pragma comment (lib,&WS2_32.lib&)&br&#define USERPORT 10001&br&#define HOST_IP_ADDR &127.0.0.1&&br&&br&main(int argc,char *argv[])&br&{&br&char buf[128];&br&SOCKET s,&br&struct sockaddr_&br&struct sockaddr_&br&int namelen,&br&&br&WSADATA&br&if((status=WSAStartup(MAKEWORD(2,2),&wsd))!=0)&br&{&br&
perror(&wsastartup() failed:&);&br&
exit(1);&br&}&br&if((s=socket(AF_INET,SOCK_STREAM,0))& 0)&br&{&br&
perror(&socket failed :&);&br&
exit(1);&br&}&br&ZeroMemory(&server,sizeof(server));&br&server.sin_family=AF_INET;&br&server.sin_port=htons(USERPORT);&br&server.sin_addr.s_addr=htons(INADDR_ANY);&br&if(bind(s,(struct sockaddr *)&server,sizeof(server))&0)&br&{&br&
perror(&bind() failed:&);&br&
exit(2);&br&}&br&if(listen(s,4)!=0)&br&{&br&
perror(&listen()failed :&);&br&
exit(3);&br&}...展开收缩
综合评分:3.5(47位用户评分)
所需积分/C币:
下载个数:200
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var q = $("#form1").serializeArray();
console.log(q);
var res_area_r = $.trim($(".res_area_r").val());
if (res_area_r == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
var mess = $(".res_area_r").val();
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, _username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click",'.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
$(".res_area_r").val($.trim($(".res_area").val()));
评论共有16条
简单调整,可以编译通过,学习下,感谢分享
编译过了,高估自己了,看不懂啊。。。
代码挺好的,直接可以编译通过
下载下来看看 应该可以做参考
linux里运行报错
编译通过,很有帮助,谢谢!
蛮好的值得参考
学习研究下,正在学些配置linux,不过一切都不会,正在研究。
虽然不是我想要那种,但是对不同操作系统直接通信有了些了解。
程序头文件不全,经过修改可以运行,可以作为学习资料,可以实现基本的通讯。
审核通过送C币
SoapUI PRO 版本 5.1.2 原始安装包+破解包
创建者:skioi
layui框架模板
创建者:ajlgl
软件设计需求书
创建者:ajlgl
积分&11068
上传者其他资源上传者专辑
CPU综合检测专业对CPU进行检测
Foxmail密码查看小工具,附说明书
桌面录像软件-安装版*小巧好用*
MS-SQL Server杂志-事务全攻略
ORACLE 书籍介绍
开发技术热门标签
VIP会员动态
下载频道积分规则调整V1710.18
CSDN下载频道积分调整公告V1710.17
开通VIP,海量IT资源任性下载
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
CSDN&VIP年卡&4000万程序员的必选
为了良好体验,不建议使用迅雷下载
socket编写windows和linux通讯程序-源码
会员到期时间:
剩余下载个数:
剩余C币:593
剩余积分:786
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
(仅够下载10个资源)
全站1200个资源免积分下载
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
全站1200个资源免积分下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
全站1200个资源免积分下载
为了良好体验,不建议使用迅雷下载
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
socket编写windows和linux通讯程序-源码

我要回帖

更多关于 编程器与下载器的区别 的文章

 

随机推荐