1、流程
服务器:
创建socket;
绑定端口;
监听;
监听到有连接请求,接受请求;
建立连接,开始对话。
客户端:
创建socket;
请求建立连接;
连接建立成功,开始对话。
2、实例代码
//服务器客户端简单聊天工具之服务器(tcp/ip)
#include<stdio.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<errno.h>
#include<netinet/in.h>
#include<unistd.h>
#include<arpa/inet.h>
//连接端口
#define
PORT 6666
//最大连接数
#define
CONNECTION 10
int
main()
{
int sockfd, client_fd,sendnum,recvnum;
char inbuf[100],outbuf[100];
socklen_t addr_size;
pid_t pid;
struct sockaddr_in my_addr, client_addr;
//socket创建
sockfd = socket(PF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket fail! \n");
return 1;
}
//服务器的地址
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(PORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
//绑定端口
if(bind(sockfd,(struct sockaddr*)&my_addr,sizeof(struct
sockaddr)) < 0)
{
perror("bind fail! \n");
close(sockfd);
return 1;
}
//开始监听
if(listen(sockfd,CONNECTION) < 0)
{
perror("listen fail! \n");
close(sockfd);
return 1;
}
addr_size = sizeof(struct sockaddr_in);
//建立连接
if((client_fd = accept(sockfd,(void
*)&client_addr,&addr_size)) < 0)
{
perror("accept fail! \n");
close(sockfd);
return 1;
}
printf("receive connection! \n");
//启动子进程
pid = fork();
if(pid < 0)
{
perror("fork fail! \n");
close(client_fd);
close(sockfd);
return 1;
}
//子进程发送消息
else if(pid == 0)
{
while(1)
{
fgets(inbuf,sizeof(inbuf),stdin);
sendnum =
send(client_fd,(void*)inbuf,sizeof(inbuf),0);
if(sendnum < 0)
{
perror("send fail! \n");
break;
}
}
}
//父进程接收消息
else if(pid > 0)
{
while(1)
{
recvnum =
recv(client_fd,(void*)outbuf,sizeof(outbuf),0);
if(recvnum < 0)
{
perror("recv fail! \n");
break;
}
if(recvnum == 0)
{
break;
}
printf("%s:%s",inet_ntoa(client_addr.sin_addr),outbuf);
}
}
close(client_fd);
close(sockfd);
return 0;
}
//服务器客户端简单聊天工具之客户端(tcp/ip)
#include<stdio.h>
#include<errno.h>
#include<sys/socket.h>
#include<unistd.h>
#include<netinet/in.h>
#include<sys/types.h>
#include<arpa/inet.h>
#define
PORT 6666
//连接端口
#define
IP "127.0.0.1"
int
main()
{
int sockfd,sendnum,recvnum;
char inbuf[100],outbuf[100];
pid_t pid;
struct sockaddr_in serv_addr;
//socket创建
sockfd = socket(PF_INET,SOCK_STREAM,0);
if(sockfd < 0)
{
perror("socket fail! \n");
return 1;
}
//服务器的地址
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(PORT);
serv_addr.sin_addr.s_addr = inet_addr(IP);
//连接服务器
if(connect(sockfd,(struct sockaddr*)&serv_addr,sizeof(struct
sockaddr)) < 0)
{
perror("connect fail! \n");
close(sockfd);
return 1;
}
printf("connect sucessful! \n");
//启动子进程
pid = fork();
if(pid < 0)
{
perror("fork fail! \n");
close(sockfd);
return 1;
}
//子进程发送消息
else if(pid == 0)
{
while(1)
{
fgets(inbuf,sizeof(inbuf),stdin);
sendnum = send(sockfd,(void*)inbuf,sizeof(inbuf),0);
if(sendnum < 0)
{
perror("send fail! \n");
break;
}
}
}
//父进程接收消息
else if(pid > 0)
{
while(1)
{
recvnum =
recv(sockfd,(void*)outbuf,sizeof(outbuf),0);
if(recvnum < 0)
{
perror("recv fail! \n");
break;
}
if(recvnum == 0)
{
break;
}
printf("%s:%s",inet_ntoa(serv_addr.sin_addr),outbuf);
}
}
close(sockfd);
return 0;
}
linux网络编程(socket)之面向连接(TCP/IP)
原文:http://www.cnblogs.com/dixonyy/p/3566772.html