哪位知道SCO UNIX 5.0.5下的socket编程方法,教一下
有详细说明的给个链接
xianren 回复于:2003-01-15 09:36:32 |
转贴内容:
进程通信的概念最初来源于单机系统,由于每个进程都在各自的地址范围内运行,为了保证两个相互通信的进程之间既不互相干扰,又协调一致的工作,操作系统为进程通信提供了相应设施,如UNIX BSD中的管道(pipe),有名管道(named pipe)和软中断信号(singal),UNIX system V的消息(message)、共享存储区(shared memory)和信号量(semaphore)等,但都局限于用在本机进程之间通信。网间进程通信要解决的是不同主机进程间的通信问题(可把同机进程通信看作其中的特例)。为此,首先要解决的是网间进程标识问题。同一主机上,不同进程可以用进程号(pid)唯一标识。但在网络环境下,各主机独立分配的进程号不能唯一标识该进程。例如主机A赋予某进程号5,在B主机也可以存在5号进程,因此5号进程这句话就没有意义了。其次,操作系统支持的网络协议众多,不同协议的工作方式不同,地址格式也不同。因此,网间进程通信还要解决多重协议的识别问题。为了解决上述问题,TCP/IP协议引入了下列几个概念。 端口 网络中可以被命名和寻址的通信端口是操作系统可分配的一种资源。按照OSI七层协议的描述,传输层与网络层最大的区别是传输层提供进程通信能力。从这个意义上讲,网络通信的最终地址就不仅是主机地址了,还包括可以描述进程的某种标识符。为此TCP/IP协议提出了协议端口的概念,用于标识通信的进程。 端口是一种抽象的软件结构,包括一些数据结构和I/O缓冲区。应用程序即进程通过系统调用与某端口建立连接(binding)后,传输层传给该端口的数据都被相应的进程所接收,相应进程发给传输层的数据都从该端口输出。在TCP/IP协议的实现中,端口操作类似于一般的I/O操作,进程获取一个端口,相当于获取本地唯一的I/O文件,可以用一般的读写原语访问。 类似于文件描述符,每个端口都拥有一个叫端口号的整数描述符,以区别不同端口。由于TCP/IP传输层的两个协议TCP和UDP是两个完全独立的软件模块,因此各自的端口号也相互独立。如TCP有一个255号端口,UDP也可以有一个255号端口,两者并不冲突。 端口号的分配是一个重要问题,有两种基本分配方式:第一种叫全局分配这是一种集中分配方式,由一个公认的中央机构根据用户需要尽行统一分配,并将结果公布于众,第二种是本地分配,又称动态连接,即进程需要访问传输层服务时,向本地操作系统提出申请,操作系统返回本地唯一的端口号,进程再通过合适的系统调用,将自己和该端口连接起来(绑定)。TCP/IP端口号的分配综合了两种方式。TCP/IP将端口号分为两部分,少量的作为保留端口,以全局方式分配给服务进程。因此,每一个标准服务器都拥有一个全局公认的端口叫周知口,即使在不同的机器上,其端口号也相同。剩余的为自由端口,以本地方式进行分配。TCP和UDP规定,小于256的端口才能作为保留端口。 地址 网络通信中的两个进程分别在两个不同的机器上。在互连网络中,两台机器可以位于不同的网络,这些网络通过网际互连设备(网关,网桥,路由器)连接。因此需要三级寻址。 1。某一主机与多个网络相连,必须指定一特定网络地址; 2。网络上美一台主机应有其唯一的地址; 3。美一主机上的每一进程应有在该主机上的唯一标识。 主机地址就是IP啦,不必多说。进程唯一标识符是十六位整数端口号。 网络字节顺序 不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节,有的则相反。为保证数据的正确性,在网络协议中需指定网络字节顺序。TCP/IP协议使用16位整数和32位整数的高价先存格式,他们均含在协议的头文件中。 连接 两个进程间的通信链路称为连接。连接在内部表现为一些缓冲区和一组协议机制,在外部表现出比无连接高的可靠性。 半相关 综上所述,网络中用一个三元组可以在全局中唯一标是一个进程:(协议,本机地址,本地端口号)这样一个三元组,叫做一个半相关,他指定连接的每半部分。 全相关 一个完整的网间进程通信需要有两个进程组成,并且只能使用同一种高层协议。也就是说TCP和UDP没法通信。因此一个完整的网间进程通信需要一个五元组来标识: (协议,本机地址,本地端口号,远地地址,远地端口号)这样一个五元组叫做一个全相关。 |
小马 回复于:2003-01-15 09:40:43 |
有没有样板程序?
急 谢谢了 |
小马 回复于:2003-01-15 10:05:15 |
有没有样板程序?
哪位能应一下! |
lixshn 回复于:2003-01-15 12:16:31 |
#include <stdio.h>
#include <errno.h> #include <time.h> #include <signal.h> #include <netdb.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/socket.h> #include <netinet/in.h> #include "../incl/hbjm.h" #define READWRITE_TIMEOUT 15 #define PKG_LEN 100 EXEC SQL include sqlca; EXEC SQL include sqlda; main() { struct servent *svrent; struct sockaddr_in addr_in; int svrsock,newsocket; int childid; int m_pkg=0; char strTime[10]; char date[9]; int val=1; set_resident(); // 进程成为常驻进程 init: signal( SIGCHLD, sig_chld ); memset(&addr_in,0,sizeof(struct sockaddr_in)); addr_in.sin_family=AF_INET; addr_in.sin_addr.s_addr=INADDR_ANY; addr_in.sin_port=htons(8003); svrsock=socket(AF_INET,SOCK_STREAM,0); if ( svrsock<0 ) { printf("socket failed!"); exit(-1); } if ( setsockopt(svrsock,SOL_SOCKET,SO_REUSEPORT,&val,sizeof(val)) ) { printf("setsockopt failed! errno=(%d)",errno); exit(-1); } if( bind(svrsock,(struct sockaddr *)&addr_in,sizeof(addr_in)) ) { close(svrsock); printf("bind failed!"); exit(-1); } if ( listen(svrsock,20) ) { close(svrsock); printf("listen failed !"); exit(-1); } while(1) { if( ( newsocket=accept(svrsock,0,0) ) < 0 ) { if( errno == EINTR ) continue; else { printf("accept failed!"); close(svrsock); goto init; } } if( ( childid = fork() ) == 0 ) { /* 收交易包 */ signal(SIGALRM,r_alarm); alarm(READWRITE_TIMEOUT); if( open_database() ) { close(newsocket); return; } if( (m_pkg= read( newsocket, r_buf, PKG_LEN )) <20 ) { printf("read pkg failed!\n"); close(newsocket); return; } do your work; if ( write( socket, snd_buf,strlen(snd_buf) ) < strlen(snd_buf) ) { printf("socket write net pgklen error!\n" ); close(newsocket); return; } } close(newsocket); 服务端的简单的sock通讯程序,可以看看! |
小马 回复于:2003-01-15 12:43:32 |
太感谢了
谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢谢 |
sdccf 回复于:2003-01-15 13:22:25 |
精华. |
yourkeychen 回复于:2003-02-05 11:08:21 |
非常感谢 |
htldm 回复于:2003-02-05 19:28:57 |
http://www.chinaunix.net/cgi-bin/bbs/topic.cgi?forum=4&topic=15780 |
千禧龙 回复于:2003-02-05 23:07:52 |
晕,其实随便找一本介绍unix下C编程的书里都有例程介绍的! |
lixuegong 回复于:2003-02-10 20:22:08 |
这么简单的问题搞的这么复杂, |
zszhx 回复于:2004-02-18 08:21:08 |
为何我用了此程序第一个连接后,还没有接收到客户端数据,就自动运行到close(newsocket)。 |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/