转自:http://blog.csdn.net/piaojun_pj/article/details/5920888

最近看了一些网络编程的书籍,一直以来总感觉网络编程神秘莫测,其实网络编程入门还是很容易学的,下面这些代码是我在linux下编写的,已经运行过了,编译之后就可以运行了。有不足之处希望大家多多指出,共同学习交流。

套接字是一种进程间的通信的方法,不同于以往介绍的进程间通信方法的是,它并不局限于同一台计算机的资源,例如文件系统空间,共享内存或者消息队列。套接字可以认为是对管道概念的扩展——一台机器上的进程可以使用套接字与另一台机器上的进程通信。因此客户与服务器可以分散在网络中。同一台机器上的进程间也可以用套接字通信。套接字是一种通信机制,客户/服务器系统既可以在本地单机上运行,也可以在网络中运行。套接字与管道的区别:它明确区分客户与服务器,可以实现将多个客户连接到一个服务器。

套接字的工作过程(服务器端):首先,服务器应用程序通过socket系统调用创建一个套接字,它是系统分配给该服务器进程的类似文件描述符的资源,不能与其他进程共享。其次,服务器进程使用bind系统调用给套接字命名。本地套接字的名字是linux文件系统的文件名,一般放在/tmp或者/usr/tmp 目录下。网络套接字的名字是与客户相连接的特定网络有关的服务标识符。此标识符允许linux将进入的针对特定端口号的连接转到正确的服务器进程。接下来,服务器进程开始等待客户连接到这个命名套接字,调用listen创建一个等待队列以便存放来自客户的进入连接。最后,服务器通过accept系统调用来接受客户的连接。此时,会产生一个与原有的命名套接字不同的新套接字,它仅用于与这个特定的客户通信,而命名套接字则被保留下来继续处理来自其他客户的连接。

套接字的工作过程(客户端):调用socket创建一个未命名套接字,将服务器的命名套接字作为一个地址来调用connect与服务器建立连接。一旦建立了连接,就可以像使用底层文件描述符那样来用套接字进行双向的数据通信。

TCP协议:

服务器端:tcp_server.c

  1. #include <stdio.h>  
  2. #include <sys/types.h>  
  3. #include <sys/socket.h>  
  4. #include <netinet/in.h>  
  5. #include <arpa/inet.h>  
  6.   
  7. int main(int argc, char *argv[])  
  8. {  
  9.     int server_sockfd;//服务器端套接字  
  10.     int client_sockfd;//客户端套接字  
  11.     int len;  
  12.     struct sockaddr_in my_addr;   //服务器网络地址结构体  
  13.     struct sockaddr_in remote_addr; //客户端网络地址结构体  
  14.     int sin_size;  
  15.     char buf[BUFSIZ];  //数据传送的缓冲区  
  16.     memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零  
  17.     my_addr.sin_family=AF_INET; //设置为IP通信  
  18.     my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上  
  19.     my_addr.sin_port=htons(8000); //服务器端口号  
  20.       
  21.     /*创建服务器端套接字--IPv4协议,面向连接通信,TCP协议*/  
  22.     if((server_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)  
  23.     {    
  24.         perror("socket");  
  25.         return 1;  
  26.     }  
  27.    
  28.         /*将套接字绑定到服务器的网络地址上*/  
  29.     if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)  
  30.     {  
  31.         perror("bind");  
  32.         return 1;  
  33.     }  
  34.       
  35.     /*监听连接请求--监听队列长度为5*/  
  36.     listen(server_sockfd,5);  
  37.       
  38.     sin_size=sizeof(struct sockaddr_in);  
  39.       
  40.     /*等待客户端连接请求到达*/  
  41.     if((client_sockfd=accept(server_sockfd,(struct sockaddr *)&remote_addr,&sin_size))<0)  
  42.     {  
  43.         perror("accept");  
  44.         return 1;  
  45.     }  
  46.     printf("accept client %s/n",inet_ntoa(remote_addr.sin_addr));  
  47.     len=send(client_sockfd,"Welcome to my server/n",21,0);//发送欢迎信息  
  48.       
  49.     /*接收客户端的数据并将其发送给客户端--recv返回接收到的字节数,send返回发送的字节数*/  
  50.     while((len=recv(client_sockfd,buf,BUFSIZ,0))>0))  
  51.     {  
  52.         buf[len]='/0';  
  53.         printf("%s/n",buf);  
  54.         if(send(client_sockfd,buf,len,0)<0)  
  55.         {  
  56.             perror("write");  
  57.             return 1;  
  58.         }  
  59.     }  
  60.     close(client_sockfd);  
  61.     close(server_sockfd);  
  62.         return 0;  
  63. }  

TCP协议:

客户端:tcp_client.c

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. int main(int argc, char *argv[])
  7. {
  8. int client_sockfd;
  9. int len;
  10. struct sockaddr_in remote_addr; //服务器端网络地址结构体
  11. char buf[BUFSIZ];  //数据传送的缓冲区
  12. memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
  13. remote_addr.sin_family=AF_INET; //设置为IP通信
  14. remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址
  15. remote_addr.sin_port=htons(8000); //服务器端口号
  16. /*创建客户端套接字--IPv4协议,面向连接通信,TCP协议*/
  17. if((client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0)
  18. {
  19. perror("socket");
  20. return 1;
  21. }
  22. /*将套接字绑定到服务器的网络地址上*/
  23. if(connect(client_sockfd,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr))<0)
  24. {
  25. perror("connect");
  26. return 1;
  27. }
  28. printf("connected to server/n");
  29. len=recv(client_sockfd,buf,BUFSIZ,0);//接收服务器端信息
  30. buf[len]='/0';
  31. printf("%s",buf); //打印服务器端信息
  32. /*循环的发送接收信息并打印接收信息--recv返回接收到的字节数,send返回发送的字节数*/
  33. while(1)
  34. {
  35. printf("Enter string to send:");
  36. scanf("%s",buf);
  37. if(!strcmp(buf,"quit")
  38. break;
  39. len=send(client_sockfd,buf,strlen(buf),0);
  40. len=recv(client_sockfd,buf,BUFSIZ,0);
  41. buf[len]='/0';
  42. printf("received:%s/n",buf);
  43. }
  44. close(client_sockfd);//关闭套接字
  45. return 0;
  46. }

UDP协议:

服务器端:udp_server.c

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. int main(int argc, char *argv[])
  7. {
  8. int server_sockfd;
  9. int len;
  10. struct sockaddr_in my_addr;   //服务器网络地址结构体
  11. struct sockaddr_in remote_addr; //客户端网络地址结构体
  12. int sin_size;
  13. char buf[BUFSIZ];  //数据传送的缓冲区
  14. memset(&my_addr,0,sizeof(my_addr)); //数据初始化--清零
  15. my_addr.sin_family=AF_INET; //设置为IP通信
  16. my_addr.sin_addr.s_addr=INADDR_ANY;//服务器IP地址--允许连接到所有本地地址上
  17. my_addr.sin_port=htons(8000); //服务器端口号
  18. /*创建服务器端套接字--IPv4协议,面向无连接通信,UDP协议*/
  19. if((server_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
  20. {
  21. perror("socket");
  22. return 1;
  23. }
  24. /*将套接字绑定到服务器的网络地址上*/
  25. if (bind(server_sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr))<0)
  26. {
  27. perror("bind");
  28. return 1;
  29. }
  30. sin_size=sizeof(struct sockaddr_in);
  31. printf("waiting for a packet.../n");
  32. /*接收客户端的数据并将其发送给客户端--recvfrom是无连接的*/
  33. if((len=recvfrom(server_sockfd,buf,BUFSIZ,0,(struct sockaddr *)&remote_addr,&sin_size))<0)
  34. {
  35. perror("recvfrom");
  36. return 1;
  37. }
  38. printf("received packet from %s:/n",inet_ntoa(remote_addr.sin_addr));
  39. buf[len]='/0';
  40. printf("contents: %s/n",buf);
  41. close(server_sockfd);
  42. return 0;
  43. }

客户端:udp_client.c

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/socket.h>
  4. #include <netinet/in.h>
  5. #include <arpa/inet.h>
  6. int main(int argc, char *argv[])
  7. {
  8. int client_sockfd;
  9. int len;
  10. struct sockaddr_in remote_addr; //服务器端网络地址结构体
  11. int sin_size;
  12. char buf[BUFSIZ];  //数据传送的缓冲区
  13. memset(&remote_addr,0,sizeof(remote_addr)); //数据初始化--清零
  14. remote_addr.sin_family=AF_INET; //设置为IP通信
  15. remote_addr.sin_addr.s_addr=inet_addr("127.0.0.1");//服务器IP地址
  16. remote_addr.sin_port=htons(8000); //服务器端口号
  17. /*创建客户端套接字--IPv4协议,面向无连接通信,UDP协议*/
  18. if((client_sockfd=socket(PF_INET,SOCK_DGRAM,0))<0)
  19. {
  20. perror("socket");
  21. return 1;
  22. }
  23. strcpy(buf,"This is a test message");
  24. printf("sending: '%s'/n",buf);
  25. sin_size=sizeof(struct sockaddr_in);
  26. /*向服务器发送数据包*/
  27. if((len=sendto(client_sockfd,buf,strlen(buf),0,(struct sockaddr *)&remote_addr,sizeof(struct sockaddr)))<0)
  28. {
  29. perror("recvfrom");
  30. return 1;
  31. }
  32. close(client_sockfd);
  33. return 0;
  34. }

socket函数API.cpp

htons();//将short类型的值从主机字节序转换为网络字节序
inet_addr();//将IP地址字符串转换为long类型的网络字节序
gethostbyname();//获得与该域名对应的IP地址
inet_ntoa();//将long类型的网络字节序转换成IP地址字符串

最新文章

  1. cron表达式
  2. jquery管理ajax异步-deferred对象
  3. [转]VB Winsock 控件TCP与UDP连接实例
  4. Educational Codeforces Round 10
  5. 吃豆子(Packman)
  6. shell下添加计划性任务
  7. [010]Try块和异常处理
  8. Windows 8 应用开发 - 应用栏
  9. tortoiseSVN 设置ignore
  10. 浅谈angularJS指令的属性
  11. (转)JAVA多线程和并发基础面试问答
  12. 【分享】jQuery无插件实现 鼠标拖动图片切换 功能
  13. document.activeElement 过滤选择文件弹窗导致的页面失焦
  14. luogu 4042 有后效性的dp
  15. [JSP] Action Tags
  16. Sql server 的float和real类型会产生科学计数法,如何消除科学计数法
  17. BZOJ.4819.[SDOI2017]新生舞会(01分数规划 费用流SPFA)
  18. SpringMVC -- 梗概--源码--壹--收参
  19. Codeforces 862B - Mahmoud and Ehab and the bipartiteness
  20. phpStudy4——前端页面使用Ajax请求并解析php返回的json数据

热门文章

  1. Linux 学习笔记(一)
  2. java随机生成简体中文取指定长度随机简体中文实用方法
  3. dedecms升级后报错
  4. Linux for windows cp 数据中文乱码
  5. Linux的一个暴力破解工具九头蛇hydra
  6. CSS3 Media Queries模板
  7. Linux下安装配置MongoDB 3.0.x 版本数据库
  8. Lucene4.3开发之分词器总结
  9. 二叉树建立,先序、中序、后序遍历(c实现)
  10. VS2010中如何查看DLL的导出接口