基于TCP的server和client编写。

来源:互联网 发布:everything是什么软件 编辑:程序博客网 时间:2024/05/22 14:54

首先看一下大家都了解c/s架构。

先讲解server的搭建:

创建TCP套接字:

设置基础信息为后面的bind()铺垫:

bind():

监听:

等待连接:

接收和发送:


client:客户端步骤就少很多了。

创建TCP套接字:

基本信息和连接:

发送和接收:





下面是源代码:

server:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
unsigned short port = 8000;
if(argc > 1)
{
port = atoi(argv[1]);
}
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("sockfd");
exit(-1);
}
struct sockaddr_in my_addr;//本地信息
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = AF_INET;//设置地址族为IPv4
my_addr.sin_port = htons(port);//设置地址的端口号信息
my_addr.sin_addr.s_addr = htonl(INADDR_ANY);//INADDR_ANY服务器可以接收任意地址

int err_log = bind(sockfd, (struct sockaddr*)&my_addr, sizeof(my_addr));
if(err_log != 0)
{
perror("binding");
close(sockfd);
exit(-1);
}

err_log = listen(sockfd, 10);
if(err_log != 0)
{
perror("listen");
close(sockfd);
exit(-1);
}
printf("listen client %d\n",port);

struct sockaddr_in client_addr;
char cli_ip[INET_ADDRSTRLEN] = " ";
socklen_t client_len = sizeof(client_addr);
int connfd;
connfd = accept(sockfd, (struct sockaddr*)&client_addr, &client_len);//等待连接
if(connfd < 0 )
{
perror("accept");
return -1;
//continue;
}
inet_ntop(AF_INET, &client_addr.sin_addr, cli_ip, INET_ADDRSTRLEN);//转换并打印信息
printf("********************************\n");
while(1)
{
char recv_buf[2048] = " ";
recv(connfd, recv_buf, sizeof(recv_buf), 0);//接收信息
printf("recv data:%s\n",recv_buf);
send(connfd, "ok", 2, 0);//向客户端发送数据
printf("ok\n");
}
close(sockfd);//关闭监听套接字
return 0;
}


client:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(int argc, char *argv[])
{
unsigned short port = 8000;
char *server_ip = "192.168.0.111";
if(argc > 1)
{
server_ip = argv[1];
}
if(argc > 2)
{
port = atoi(argv[2]);
}
int sockfd = 0;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if(sockfd < 0)
{
perror("socket ");
exit(-1);
}
struct sockaddr_in server_addr;
bzero(&server_addr, sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(port);
inet_pton(AF_INET, server_ip, &server_addr.sin_addr);

int err_log = connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
if(err_log != 0)
{
perror("connect");
close(sockfd);
exit(-1);
}
while(1)
{
char send_buf[512] = " ";
char recv_buf[512] = " ";
printf("send data to %s:%d\n",server_ip, port);

printf("send:");
fgets(send_buf, sizeof(send_buf), stdin);
send_buf[strlen(send_buf)-1] = 0;
send(sockfd, send_buf, strlen(send_buf), 0);//向服务器发送数据
printf("send:%s\n",send_buf);

recv(sockfd, recv_buf, sizeof(recv_buf), 0);//接收数据
printf("recv:%s\n",recv_buf);


}


return 0;
}

原创粉丝点击