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

系统编程之网络编程(TCP客户端与服务器的搭建)

2017-08-16 17:57 633 查看
TCP是重要的传输层协议,是一种有连接的、可靠的传输。传输数据前要先建立连接,如果传输错误或者数据丢失,就会重传。因此使用TCP,开销大,速度慢。
UDP也是传输层协议,它是无连接的、不可靠的传输服务。不必要在数据传输之前建立会话,但可能造成数据的丢失。系统只保证尽力发送。优点是传输速度快、开销小。视频点播使用的就是UDP。
下面是我实现的TCP客户端与服务器的搭建:
服务器:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>

#define PORT 9999  //端口号

//服务器的搭建
int main()
{
//创建一个套接字
int listen_socket = socket(AF_INET,SOCK_STREAM, 0);
if (listen_socket == -1)
{
perror("socket");
return -1;
}

//命名套接字,绑定本地的ip地址和端口
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));   //清空
addr.sin_family = AF_INET;      //设置地址族
addr.sin_port = htons(PORT);    //设置端口
addr.sin_addr.s_addr = htonl(INADDR_ANY);  //使用本地任意IP地址
int ret = bind(listen_socket, (struct sockaddr *)&addr, sizeof(addr));  //绑定
if (ret == -1)
{
perror("bind");
return -1;
}

//监听本地套接字
if(listen(listen_socket, 5) == -1)
{
perror("listen");
return -1;
}

while(1)
{
printf ("等待客户端连接.......\n");

//接收连接
// 监听套接字不能用来与客户端进行通信,它的职责是监听客户端的连接
// accpet 处理客户端的连接,如果成功接收,会返回一个新的套接字,用来与客户端进行通信
// accept的第三个参数 是一个传入传出参数
struct sockaddr_in client_addr;  // 用来保存客户端的ip和端口信息
int len = sizeof(client_addr);
int client_socket = accept(listen_socket, (struct sockaddr *)&client_addr, &len);  //连接,返回新的套接字,用于和客户端通信
if (client_socket == -1)
{
perror("accept");
return -1;
}

printf ("成功接收一个客户端: %s\n", inet_ntoa(client_addr.sin_addr));
char buf[1024];
while (1)
{
int ret = read (client_socket, buf, 1023);
if(ret == 0)
{
printf("client is close!\n");
break;
}
buf[ret] = '\0';
printf ("%s\n", buf);

write (client_socket, buf, 1023);
}
close(client_socket);  //关闭客户端通信套接字
}
close(listen_socket);  //关闭监听套接字

return 0;

}


客户端:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>

//客户端的搭建
int main(int argc,char *argv[])
{
if(argc!=3)
{
fprintf(stderr,"Usage:%s hostname \a\n",argv[0]);
exit(1);
}

//创建一个套接字
int server_socket = socket(AF_INET,SOCK_STREAM, 0);
if (server_socket == -1)
{
perror("socket");
return -1;
}

//设置IP地址和端口
struct sockaddr_in addr;
memset(&addr,0,sizeof(addr));
addr.sin_family = AF_INET;      //设置地址族
addr.sin_port = htons((unsigned short)atoi(argv[2]));    //设置端口
addr.sin_addr.s_addr = inet_addr(argv[1]);  //设置IP地址

//连接服务器
int ret = connect(server_socket, (struct sockaddr *)&addr,sizeof(struct sockaddr));
if (ret == -1)
{
perror("bind");
return -1;
}
printf ("连接到服务器:%s\n",argv[1]);

char buf[1024];

while (1)
{
printf("input:");
scanf ("%s",buf);
write (server_socket,buf, 1023);
int ret = read (server_socket, buf, 1023);
buf[ret] = '\0';
printf ("receive = %s\n", buf);
}

close(server_socket);  //关闭套接字

return 0;

}


运行结果:



本程序还只能实现一个客户端的连接,想要实现多个客户端连接,就要用到多线程编程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐