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