您的位置:首页 > 理论基础 > 计算机网络

linux网络通信(TCP和UDP)

2015-05-18 16:02 309 查看
1 TCP方式



2 服务器

/*server.c*/

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/ioctl.h>

#include <unistd.h>

#include <netinet/in.h>

#define PORT 4321

#define BUFFER_SIZE 1024

#define MAX_QUE_CONN_NM 5

int main()

{

struct sockaddr_in server_sockaddr, client_sockaddr;

int sin_size, recvbytes;

int sockfd, client_fd;

char buf[BUFFER_SIZE];

/*建立 socket 连接*/

if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)

{

perror("socket");

exit(1);

}

printf("Socket id = %d\n",sockfd);

/*设置 sockaddr_in 结构体中相关参数*/

server_sockaddr.sin_family = AF_INET;

server_sockaddr.sin_port = htons(PORT);

server_sockaddr.sin_addr.s_addr = INADDR_ANY;

//服务器可以监听所有网卡SERVPORT端口上接受到的数据。

//作为服务器,你要绑定【bind】到本地的IP地址上进行监听【listen】,

//但是你的机器上可能有多块网卡,也就有多个IP地址,这时候你要选择绑定在哪个IP上面,
//如果指定为INADDR_ANY,那么系统将绑定默认的网卡【即IP地址】。


bzero(&(server_sockaddr.sin_zero), 8);

int i = 1;/* 使得重复使用本地地址与套接字进行绑定 */

setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &i, sizeof(i));

if (bind(sockfd, (struct sockaddr*)&server_sockaddr, sizeof(struct sockaddr))== -1)

{

perror("bind");

exit(1);

}

printf("Bind success!\n");

if (listen(sockfd, MAX_QUE_CONN_NM) == -1)

{

perror("listen");

exit(1);

}

printf("Listening....\n");

sin_size = sizeof(struct sockaddr_in);

/*调用 accept 函数,等待客户端的连接*/

if((client_fd=accept(sockfd,(struct sockaddr *)&client_sockaddr, &sin_size)) == -1)

{

perror("accept");

exit(1);

}

/*调用 recv 函数接收客户端的请求*/

memset(buf , 0, sizeof(buf));

if ((recvbytes = recv(client_fd, buf, BUFFER_SIZE, 0)) ==-1)

{

perror("recv");

exit(1);

}

printf("Received a message: %s\n", buf);

close(sockfd);

exit(0);

}

# ./server

3 客户

#include <sys/types.h>

#include <sys/socket.h>

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/ioctl.h>

#include <unistd.h>

#include <netdb.h>

#include <netinet/in.h>

#define PORT 4321

#define BUFFER_SIZE 1024

int main(int argc, char *argv[])

{

int sockfd, sendbytes;

char buf[BUFFER_SIZE];

struct hostent *host;

struct sockaddr_in serv_addr;

if(argc < 3)

{

fprintf(stderr,"USAGE: ./client Hostname(or ip address)Text\n");

exit(1);

}

/*地址解析函数*/

if ((host = gethostbyname(argv[1])) == NULL)

{

perror("gethostbyname");

exit(1);

}

memset(buf, 0, sizeof(buf));

sprintf(buf, "%s", argv[2]);

/*创建 socket*/

if ((sockfd = socket(AF_INET,SOCK_STREAM,0)) == -1)

{

perror("socket");

exit(1);

}

/*设置 sockaddr_in 结构体中相关参数*/

serv_addr.sin_family = AF_INET;

serv_addr.sin_port = htons(PORT);

serv_addr.sin_addr = *((struct in_addr *)host->h_addr);

bzero(&(serv_addr.sin_zero), 8);

/*调用 connect 函数主动发起对服务器端的连接*/

if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct sockaddr)) == -1)

{

perror("connect");

exit(1);

}

/*发送消息给服务器端*/

if ((sendbytes = send(sockfd, buf, strlen(buf), 0)) == -1)

{

perror("send");

exit(1);

}

close(sockfd);

exit(0);

}

# ./client localhost(或者 IP 地址) Hello!

gcc -o server server.c gcc -o client client.c

2 udp方式

该实例分为客户端和服务器端,其中服务器端首先建立起 socket,然后

调用本地端口的绑定,

接着就开始等待客户端建立联系。

客户端则在建立 socket 之后直

接往上面扔数据,不需要与服务器建立连接。



server.c

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<netdb.h>

#include<errno.h>

#include<sys/types.h>

int port=8888;

int main()

{

int sockfd;

int len;

int z;

char buf[256];

struct sockaddr_in adr_inet;

struct sockaddr_in adr_clnt;

printf("等待客户端....\n");

/* 建立 IP 地址 */

adr_inet.sin_family=AF_INET;

adr_inet.sin_port=htons(port);

adr_inet.sin_addr.s_addr =htonl(INADDR_ANY);

bzero(&(adr_inet.sin_zero),8);

len=sizeof(adr_clnt);

/* 建立 socket */

sockfd=socket(AF_INET,SOCK_DGRAM,0);

if(sockfd==-1)

{

perror("socket 出错");

exit(1);

}

/* 绑定 socket */

z=bind(sockfd,(struct sockaddr*)&adr_inet,sizeof(adr_inet));

if(z==-1)

{

perror("bind 出错");

exit(1);

}

while(1)

{

/* 接受传来的信息 */

z=recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&adr_clnt,&len);

if(z<0)

{

perror("recvfrom 出错");

exit(1);

}

buf[z]=0;

printf("接收:%s", buf);

/* 收到 stop 字符串,终止连接*/

if(strncmp(buf,"stop",4)==0)

{

printf("结束....\n");

break;

}

}

close(sockfd);

exit(0);

}

client.c

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#include<sys/socket.h>

#include<netinet/in.h>

#include<arpa/inet.h>

#include<netdb.h>

#include<errno.h>

#include<sys/types.h>

int port=8888;

int main()

{

int sockfd;

int i=0;

int z;

char buf[80],str1[80];

struct sockaddr_in adr_srvr;

FILE *fp;

printf("打开文件......\n");

/*以只读的方式打开 liu 文件*/

fp=fopen("liu","r");

if(fp==NULL)

{

perror("打开文件失败");

exit(1);

}

printf("连接服务端...\n");

/* 建立 IP 地址 */

adr_srvr.sin_family=AF_INET;

adr_srvr.sin_port=htons(port);

adr_srvr.sin_addr.s_addr = htonl(INADDR_ANY);

bzero(&(adr_srvr.sin_zero),8);

sockfd=socket(AF_INET,SOCK_DGRAM,0);

if(sockfd==-1)

{

perror("socket 出错");

exit(1);

}

printf("发送文件 ....\n");

/* 读取三行数据,传给 udpserver*/

for(i=0;i<3;i++)

{

fgets(str1,80,fp);

printf("%d:%s",i,str1);

sprintf(buf,"%d:%s",i,str1);

z=sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr * )&adr_srvr,sizeof(adr_srvr));

if(z<0)

{

perror("send 出错");

exit(1);

}

}

printf("发送.....\n");

sprintf(buf,"stop\n");

z=sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&adr_srvr,sizeof(adr_srvr));

if(z<0)

{

perror("sendto 出错");

exit(1);

}

fclose(fp);

close(sockfd);

exit(0);

}

gcc -o server server.c gcc -o client client.c
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: