赞
踩
一、通信流程
TCP:
UDP:
部分函数知识可以参考之前写的 Linux 网络编程——TCP
TCP通信:
客户端:
- #include<stdio.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<stdlib.h>
- #include<memory.h>
- #include<string.h>
-
-
- #define PORT 8888
- int main(int argc,char **argv){
- int sock;
- struct sockaddr_in my_addr;
- int len;
- char buf[100];
- if(argc <3){
- printf("Usage: %s <ip> <port> <message>",argv[0]);
- exit(1);
- }
-
- if((sock=socket(AF_INET,SOCK_STREAM,0))<0){
- printf("socket create error!\n");
- exit(1);
- }
- my_addr.sin_family=AF_INET;
- my_addr.sin_port=htons(8888);
- if(inet_aton(argv[1],(struct in_addr *)&my_addr.sin_addr.s_addr) == 0){
- printf("%s chage error!\n",argv[1]);
- exit(1);
- }
- if(connect(sock,(struct sockaddr*)&my_addr,sizeof(struct sockaddr))<0){
- printf("connect error!\n");
- exit(1);
- }
- printf("connected!\n");
-
- while(1){
- memset(buf,0,100);
- len=recv(sock,buf,100,0);
- if(len<0){
- printf("recv error!\n");
- exit(1);
- }else if(len == 0){
- printf("the client quit!\n");
- exit(1);
- }else{
- printf("receive message: %s \n",buf);
- }
- printf("-------------------------\n");
- memset(buf,0,100);
- printf("Input message to send: ");
- fgets(buf,100,stdin);
- len=send(sock,buf,strlen(buf)-1,0);
- if(len<0){
- printf("send error!\n");
- exit(1);
- }else{
- printf("send succeed! send : %s\n",buf);
- }
- }
- close(sock);
- }
服务端:
- #include<stdio.h>
- #include<sys/socket.h>
- #include<netinet/in.h>
- #include<stdlib.h>
- #include<memory.h>
- #include<string.h>
- #include<sys/socket.h>
-
- #define PORT 8888
- int main(){
- int sock,new_sock;
- struct sockaddr_in my_addr,client_addr;
- int len;
- char buf[100];
-
- if((sock=socket(AF_INET,SOCK_STREAM,0))<0){
- printf("socket create error!\n");
- exit(1);
- }
- memset(&my_addr,0,sizeof(my_addr));
- my_addr.sin_family=AF_INET;
- my_addr.sin_port=htons(PORT);
- my_addr.sin_addr.s_addr=INADDR_ANY;
-
- if(bind(sock,(struct sockaddr*)&my_addr,sizeof(my_addr))==-1){
- printf("bind error!\n");
- exit(1);
- }
- if(listen(sock,5)<0){
- printf("listen error!\n");
- exit(1);
- }
- len=sizeof(struct sockaddr);
- if((new_sock=accept(sock,(struct sockaddr*)&client_addr,&len))<0){
- printf("accept error!\n");
- exit(1);
- }else{
- printf("server: get connection from %s,port %d socket %d \n",inet_ntoa(client_addr.sin_addr),ntohs(client_addr.sin_port),new_sock);
-
- }
- while(1){
- memset(buf,0,100);
- printf("Input message to send: ");
- fgets(buf,100,stdin);
- if(!strncasecmp(buf,"quit",4)){
- printf("server is closing...\n");
- break;
- }
- len=send(new_sock,buf,strlen(buf)-1,0);
- if(len<0){
- printf("send error!\n");
- exit(1);
- }else{
- printf("send succeed! send : %s\n",buf);
- }
- printf("------------------------------\n");
- memset(buf,0,100);
- len=recv(new_sock,buf,100,0);
- if(len<0){
- printf("recv error!\n");
- exit(1);
- }else if(len == 0){
- printf("the client quit!\n");
- break;
- }else{
- printf("receive message: %s \n",buf);
- }
- }
- close(sock);
- close(new_sock);
- }
相对于TCP来说UDP就要简单写,毕竟步骤少嘛:
服务端 :
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <arpa/inet.h>
-
- int main(int argc, char **argv){
- struct sockaddr_in s_addr,c_addr;
- int sock;
- socklen_t addr_len;
- int len;
- char buff[128];
-
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
- perror("socket");
- exit(errno);
- } else
- printf("create socket.\n\r");
-
- memset(&s_addr, 0, sizeof(struct sockaddr_in));
-
- s_addr.sin_family = AF_INET;
- s_addr.sin_port = htons(7838);
- s_addr.sin_addr.s_addr = INADDR_ANY;
-
- if ((bind(sock, (struct sockaddr *) &s_addr, sizeof(s_addr))) == -1) {
- perror("bind");
- exit(errno);
- } else
- printf("bind address to socket.\n\r");
-
- addr_len = sizeof(c_addr);
- while (1) {
- memset(buff,0,sizeof(buff));
- //第三个参数标识为0,第四个参数为信息来源主机地址信息
- len = recvfrom(sock, buff, sizeof(buff) - 1, 0, (struct sockaddr *) &c_addr, &addr_len);
- if (len < 0) {
- perror("recvfrom");
- exit(errno);
- }
-
- buff[len] = '\0';
- printf("recive come from %s:%d message:%s\n\r",inet_ntoa(c_addr.sin_addr), ntohs(c_addr.sin_port), buff);
- }
- return 0;
- }
-
客户端:
- #include <stdio.h>
- #include <string.h>
- #include <sys/types.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <arpa/inet.h>
-
- int main(int argc, char **argv){
- struct sockaddr_in s_addr;
- int sock;
- int addr_len;
- int len;
- char buff[128];
-
- if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
- perror("socket");
- exit(errno);
- } else
- printf("create socket.\n\r");
-
- s_addr.sin_family = AF_INET;
- s_addr.sin_port = htons(7838);
- if (argc>2){
- s_addr.sin_addr.s_addr = inet_addr(argv[1]);
- strcpy(buff,argv[2]);
- }
- else {
- printf("input sever ip!\n");
- exit(0);
- }
-
- addr_len = sizeof(s_addr);
- len = sendto(sock, buff, strlen(buff), 0, (struct sockaddr *) &s_addr, addr_len);
- if (len < 0) {
- printf("\n\rsend error.\n\r");
- return 3;
- }
-
- printf("send success.\n\r");
- return 0;
- }
-
本篇博客出自 阿修罗道,转载请注明出处:http://blog.csdn.net/fansongy/article/details/6896851
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。