1、失败,返回1,并设置errno 参数说明: domain指明所使用的协议族,通常为PF_INET,表示互联网协议族(TCP/IP协议 族; type参数指定socket的类型: SOCK_STREAM 提供有序、可靠、双向及基于连接的字节流 SOCK_DGRAM 支持数据报 SOCK_SEQPACKET 提供有序、可靠、双向及基于连接的数据报通信 SOCK_RAW 提供对原始网络协议的访问 SOCK_RDM 提供可靠的数据报层,但是不保证有序性 protocol通常赋值0. socket描述符是一个指向内部数据结构的指针,它指向描述符表入口。调用socket函数时,socket执行体将建立一个
2、socket,实际上建立一个socket意味着为一个socket数据结构分配存储空间。socket执行体为你管理描述符表。 两个网络程序之间的一个网络连接包括五种信息:通信协议、本地协议地址、本地主机端口、远端主机地址和远端协议端口。socket数据结构中包含这五种信息。Socket绑定 bind函数原型为:#include int bind(int sock_fd,struct sockaddr *my_addr, int addrlen); 功能说明:将套接字和指定的端口相连。成功返回0,否则,返回1,并置errno.sock_fd是调用socket函数返回的socket描述符, my_a
3、ddr是一个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针; addrlen常被设置为sizeof(struct sockaddr)。 struct sockaddr结构类型是用来保存socket信息的: struct sockaddr unsigned short sa_family; /* 地址族, AF_xxx */ char sa_data14; /* 14 字节的协议地址 */ ; sa_family一般为AF_INET,代表Internet(TCP/IP)地址族; sa_data则包含该socket的IP地址和端口号。 另外还有一种结构类型: struct soc
4、kaddr_in short int sin_family; /* 地址族 */ unsigned short int sin_port; /* 端口号 */ struct in_addr sin_addr; /* IP地址 */ unsigned char sin_zero8; /* 填充0 以保持与struct sockaddr同样大小 */ 这个结构更方便使用。sin_zero用来将sockaddr_in结构填充到与struct sockaddr同样的长度,可以用bzero()或memset()函数将其置为零。指向sockaddr_in 的指针和指向sockaddr的指针可以相互转换,这
5、意味着如果一个函数所需参数类型是sockaddr时,你可以在函数调用的时候将一个指向 sockaddr_in的指针转换为指向sockaddr的指针;或者相反。 使用bind函数时,可以用下面的赋值实现自动获得本机IP地址和随机获取一个没有被占用的端口号: my_addr.sin_port = 0; /* 系统随机选择一个未被使用的端口号 */ my_addr.sin_addr.s_addr = INADDR_ANY; /* 填入本机IP地址 */ 通过将my_addr.sin_port置为0,函数会自动为你选择一个未占用的端口来使用。同样,通过将my_addr.sin_addr.s_addr置
6、为INADDR_ANY,系统会自动填入本机IP地址。 注意在使用bind函数是需要将sin_port和sin_addr转换成为网络字节优先顺序。 计算机数据存储有两种字节优先顺序:高位字节优先和低位字节优先(大端和小端)。Internet上数据以高位字节优先顺序在网络上传输,所以对于在内部是以低位字节优先方式存储数据的机器,在Internet上传输数据时就需要进行转换,否则就会出现数据不一致。 Bind()函数在成功被调用时返回0;出现错误时返回-1并将errno置为相应的错误号。 需要注意的是,在调用bind函数时一般不要将端口号置为小于1024的值,因为1到1024是保留端口号,你可以选择
7、大于1024中的任何一个没有被占用的端口号。连接 面向连接的客户程序使用connect函数来配置socket并与远端服务器建立一个TCP连接,其函数原型为: #includestring.herrno.hnetinet/in.hpthread.h#define LISTEN_LEN 10int err,sd;char rd_buf100, wr_buf100;void *thread_read1(void *arg) while(1) memset(rd_buf,0,100); read(sd,rd_buf,100); printf(%sn,rd_buf); sleep(2); return
8、NULL;void *thread_write1(void *arg) memset(wr_buf, 0, 100); scanf(%s, wr_buf); write(sd,wr_buf,sizeof(wr_buf);int main() pthread_t tid1,tid2; int server_len,client_len; struct sockaddr_in server_ip,client_ip; sd = socket(AF_INET,SOCK_STREAM,0); if(sd 0)socket failed! errno = %dn,errno); close(sd); r
9、eturn -1; server_ip.sin_family = AF_INET; server_ip.sin_port = htons(5678); server_ip.sin_addr.s_addr = htonl(INADDR_ANY); memset(server_ip.sin_zero,0,8); err = connect(sd,(struct sockaddr *)(&server_ip),sizeof(struct sockaddr); if(err connect failed! err = pthread_create(&tid1,NULL,thread_read1,NUL
10、L); if(err != 0)thread_read1 creat failed!tid2,NULL,thread_write1,NULL);thread_write1 creat failed! pthread_join(tid1,NULL); pthread_join(tid2,NULL); close(sd); return 0 ;服务器:int i=0,err,sd,ad;char buf12100,buf21100;void *thread_read1(void *arg);void *thread_write1(void *arg); read(ad,buf12,100);, b
11、uf12); memset(buf21, 0, 100);, buf21); write(ad,buf21,100); err = bind(sd,(struct sockaddr *)(&bind failed! err = listen(sd,LISTEN_LEN);listen failed! client_len = sizeof(struct sockaddr); while(1) ad = accept(sd,(struct sockaddr *)(&client_ip),&client_len); if(ad 0 ) printf(accept failed! close(sd)
12、; return -1; err = pthread_create(& if(err ! close(ad); pthread_join(tid1, NULL); pthread_join(tid2, NULL); close(ad);3运行测试结果4结论这是一个很简单又很复杂的过程,从来没有接触过虚拟机,开始连软件都不会打开,逐渐学会了使用linux编程。通过老师的帮助,查资料学习最后进行相应的修改。致谢本次实验由于对软件和linux编程都不了解,并非个人独立完成,系我与李倩同学一起交流完成,她给了我非常大的帮助。非常感谢老师们总是不厌其烦的给我们讲解实验过程中的不懂之处以及课上在实验室的指
13、导。这次实验从什么都不懂到做出成果其中有不少曲折,感谢老师和研究生学长学姐们不断的给我们鼓励,并提出程序上的不足,使我们能有进一步改进设计的正确方向。衷心祝愿老师学长学姐们工作顺利,心想事成!参考文献【1】章坚武,李杰,姚英彪.嵌入式系统设计与开.西安:西安电子科技大学出版社,2009.【2】科默,史蒂文. 用TCP/IP进行网际互连.北京:电子工业出版社.2013【3】郭德响. 一种开放式数控系统的研究与应用D. 江苏大学 2009【4】吴长忠. 面向网络化制造开放式数控系统的研究D. 山东大学 2008【5】杨路明.C语言程序设计.北京:北京邮电大学出版社,2005.【6】谢希仁.计算机网络.电子工业出版社,2008.【7】陈更力,张青.基于JavaSocket网络编程的一种新实现J.电脑开发与用,2006.
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1