当前位置: 技术问答>linux和unix
嵌入式uclinux中网络编程的问题
来源: 互联网 发布时间:2015-08-15
本文导语: 此问题出在嵌入式的uclinux中,即CPU为NOMMU管理。 我在uclinux上运行了服务器端的程序,此服务器程序调用socket,bind,listen来建立一固定端口的监听。客户端使用服务器的IP+固定端口来连接服务器。 每个客户端中都...
此问题出在嵌入式的uclinux中,即CPU为NOMMU管理。
我在uclinux上运行了服务器端的程序,此服务器程序调用socket,bind,listen来建立一固定端口的监听。客户端使用服务器的IP+固定端口来连接服务器。
每个客户端中都已经固定设置了所要连接的服务器端口,不能更改,也就是服务器端一定要有此端口在监听。
单个客户端与服务器端都没正常。问题在于有多个客户端时候
当有俩个以上客户端连接服务器程序时,服务器vfork()出另一个经常来处理此连接,但是新fork出来的进程却不能使用已建立连接的socket描述符(因为其完全拷贝原进程,且重新执行,造成bind错误)。
我推测嵌入式CPU的NOMMU使得多进程间无法共享描述符等资源,不知道system IPC有没有效?能否在多进程间传递socket描述符?
我试了setsockopt进行IP端口复用,不知道是不是参数有问题,仍然是不能在服务器端同时bind同一个IP+端口。
这个问题是此项目最后的部分了,高手帮忙啊!
我在uclinux上运行了服务器端的程序,此服务器程序调用socket,bind,listen来建立一固定端口的监听。客户端使用服务器的IP+固定端口来连接服务器。
每个客户端中都已经固定设置了所要连接的服务器端口,不能更改,也就是服务器端一定要有此端口在监听。
单个客户端与服务器端都没正常。问题在于有多个客户端时候
当有俩个以上客户端连接服务器程序时,服务器vfork()出另一个经常来处理此连接,但是新fork出来的进程却不能使用已建立连接的socket描述符(因为其完全拷贝原进程,且重新执行,造成bind错误)。
我推测嵌入式CPU的NOMMU使得多进程间无法共享描述符等资源,不知道system IPC有没有效?能否在多进程间传递socket描述符?
我试了setsockopt进行IP端口复用,不知道是不是参数有问题,仍然是不能在服务器端同时bind同一个IP+端口。
这个问题是此项目最后的部分了,高手帮忙啊!
|
用thread
|
你的服务器端只能一个客户连接?太夸张了吧,我的理解,新fork出来的进程创建出新的socket描述符,然后用这个新的socket进行通讯。windows下这个过程一般会用线程进行处理
|
在x86架构的CPU上运行使用的vfork()还是fork()
vfork() is a special case of clone(2). It is used to create new
processes without copying the page tables of the parent process.
It may be useful in performance sensitive applications where a
child will be created which then immediately issues an execve().
vfork() differs from fork in that the parent is suspended until the
child makes a call to execve(2) or _exit(2). The child shares all
memory with its parent, including the stack, until execve() is
issued by the child. The child must not return from the current
function or call exit(), but may call _exit().
vfork() is a special case of clone(2). It is used to create new
processes without copying the page tables of the parent process.
It may be useful in performance sensitive applications where a
child will be created which then immediately issues an execve().
vfork() differs from fork in that the parent is suspended until the
child makes a call to execve(2) or _exit(2). The child shares all
memory with its parent, including the stack, until execve() is
issued by the child. The child must not return from the current
function or call exit(), but may call _exit().
|
uClinux 有fork限制 吧,为什么不用 pthread 呢?thread 效率高
|
从命令行参数传进去就可以。