关于socket编程的几点不明最近在看《unix网络编程》,有些地方有困惑,望解答:1.socket里的数据是怎样存储的?
关于socket编程的几点不明
最近在看《unix网络编程》,有些地方有困惑,望解答:
1.socket里的数据是怎样存储的?就拿回射服务器/客户端程序来说,client向socket里写数据,server读socket里的数据后socket里还有数据么?如果有的话,那么server又向socket写数据,新的数据是在原有数据的尾端还是直接覆盖?client再读的时候是从头开始读么?socket中是否有和文件偏移量类似的东西?
2.还是回射程序,假设client以很快的速度向socket中写两次数据,快到server还没来得及读,那么会不会对回射结果有影响?
3.如果我在同一个端口上绑定2个socket,cli_write和serv_write,一个client只能写server只能读,另一个client只能读server只能写(有点类似于父子进程间的管道),那么建立连接的程序怎么写?只有一个socket的话我可以确定server和client连的是同一个socket。但是如果有2个,我怎么做才能分清连的是哪个socket?
有点长。。。希望热心人解答,谢谢!!!
[解决办法]
更正一下。采用SO_REUSEADDR选项后, 可以同时绑定多个socket到一个端口上。这时候,IP应该要不一样。
比如:
struct sockaddr_in addr1;
addr1.sin_family = AF_INET;
addr1.sin_port = htons(9911);
addr1.sin_addr.s_addr = inet_addr("127.0.0.1"); //从本机发来的数据会进这个socket1。
struct sockaddr_in addr2;
addr2.sin_family = AF_INET;
addr2.sin_port = htons(9911);
addr2.sin_addr.s_addr = inet_addr("192.1.1.111"); //从192.1.1.*上其它主机发来的数据会进这个socket2。
bind(sockfd1, (struct sockaddr *)&addr1, sizeof(addr1));
bind(sockfd2, (struct sockaddr *)&addr2, sizeof(addr2));
这两个socket虽然共用同一个端口,其实是各自独立的,互不相干。不能互相访问数据,更不是你想象的那样,连成C/S。
你说的Client/Server通常是要两个socket主动配合的。
拿TCP来说,socket A和socket B,一个listen,一个connect,连在一起。
在一端向A socket写数据,另一端就能从B读。反之一样。
A和B可以位于同一台机器上。你想要的应该是这个效果吧。