linux网络编程之TCP编程----初级
TCP编程步骤
一、TCP服务器:
TCP编程的服务器端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt(); *可选
3、绑定IP地址、端口等信息到socket上,用函数bind();
4、开启监听,用函数listen();
5、接收客户端上来的连接,用函数accept();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
8、关闭监听;
二、.TCP客户端:
TCP编程的客户端一般步骤是:
1、创建一个socket,用函数socket();
2、设置socket属性,用函数setsockopt();*可选
3、绑定IP地址、端口等信息到socket上,用函数bind();*可选
4、设置要连接的对方的IP地址和端口等属性;
5、连接服务器,用函数connect();
6、收发数据,用函数send()和recv(),或者read()和write();
7、关闭网络连接;
下面贴出具体实现的代码:
TCP服务端:
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <errno.h>
int main()
{
int fd;
int len;
int ret;
struct sockaddr_in remoteaddr;
struct sockaddr_in localaddr;
char buf[1024];
fd = socket(AF_INET, SOCK_STREAM, 0); //建立套接口
if(fd == -1)
{
printf("socket() error %d\n",errno);
return -1;
}
/* 绑定地址和端口*/
localaddr.sin_family = AF_INET;
localaddr.sin_addr.s_addr = htonl(INADDR_ANY);
localaddr.sin_port = htons(5000);
len = sizeof(localaddr);
if(bind(fd, (struct sockaddr *)&localaddr, len) == -1)
{
printf("bind() error\n");
return -1;
}
/* 建立套接口队列 开始监听*/
if(listen(fd, 5) == -1) //如果连接数目达此上限(5)则client端将收到ECONNREFUSED的错误。
{
printf("listen() error\n");
return -1;
}
/*下面实现当有有客户端连接进来时就向客服端发送一个"hello"的问候 ,然后就关闭与客户端的连接*/
char data[1024];
sprintf(data,"%s\n","hello");
while(1)
{
int client_sockfd = accept(fd,(struct sockaddr *)&remoteaddr, &len);
//获取连接进来的socket ,函数将阻塞在这里直到有连接为止。
ret = send(client_sockfd, (void *)data, strlen(data),0); //向客服端发送 hello
if(ret <= 0)
{
printf("send() error\n");
}
printf("sent line:%s", data);
close(client_sockfd); //断开与客服端的连接
}
}
TCP客户端
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include<arpa/inet.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd;
int len,ret;
struct sockaddr_in remoteaddr;
fd = socket(AF_INET, SOCK_STREAM, 0); //建立套接口
remoteaddr.sin_family = AF_INET;
remoteaddr.sin_addr.s_addr = inet_addr("127.0.0.1"); //设置服务器IP
remoteaddr.sin_port = htons(5000); //设置服务器端口
len = sizeof(remoteaddr);
ret = connect(fd, (struct sockaddr *)&remoteaddr, len); //连接到服务器
if(ret == -1)
{
printf("connect() error\n");
return -1;
}
/*下面实现一旦读取到数据就将其输出到屏幕*/
char data[1024];
bzero(data,1024); //用0填充data.填充长度为1024
while(1)
{
int ret = recv(fd, (void *)data, 1024, 0); //读取数据,函数将阻塞在这里直到读取到数据为止。
if(ret <= 0)
{
printf("server recieve data failed!--\n");
}
else
{
printf("client read str:%s\n", data);
}
}
}
至此一个服务器和客服端的雏形完成了。
但这根本无法投入实际使用,我们将在下一节来改进。