服务器端等待客户端连接,连接成功后,打印客户端的IP和PORT,然后循环接收数据,缓冲区无数据就阻塞待待。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>
#include <signal.h>
#define MAXBUF 10 // 缓冲区大小
#define DEFAULT_PORT 8888 // 默认端口
#define DEFAULT_MSGNUM 1000 // 最大连接数量
int main(int argc,char *argv[])
{
int ret;
unsigned char buf[MAXBUF];
int fd_socket, new_fd, len;
struct sockaddr_in AddrServer;
struct sockaddr_in AddrClient;
bzero(&AddrServer,sizeof(AddrServer) );
bzero(&AddrClient,sizeof(AddrClient) );
signal(SIGCHLD,SIG_IGN);
/* 1. 建立一个Socket */
if( (fd_socket = socket(AF_INET, SOCK_STREAM,0) ) == -1)
{
perror("socket");
exit(0);
}
/* 2. bind */
AddrServer.sin_family = AF_INET; /* IPV4 */
if(argv[1]) /* 命令行输入了IP Addr */
{
AddrServer.sin_addr.s_addr = inet_addr( argv[1]);
}
else /* 本机任IP */
{
AddrServer.sin_addr.s_addr = INADDR_ANY;
}
if(argv[2]) /* 命令行输入了端口号 */
{
AddrServer.sin_port = htons( atoi(argv[2]));
}
else /* 采用默认端口 */
{
AddrServer.sin_port = DEFAULT_PORT;
}
/* 3. bind */
ret = bind(fd_socket, (struct sockaddr *)&AddrServer, sizeof(struct sockaddr) );
if(ret == -1)
{
perror("bind");
exit(0);
}
/* 4. listen */
if( listen(fd_socket,DEFAULT_MSGNUM) == -1 )
{
perror("listen");
exit(0);
}
printf(" Server Create Success,Server IP: %s::%d \n",inet_ntoa(AddrServer.sin_addr),ntohs(AddrServer.sin_port));
printf(" Server wait for connect.......\n");
/* 4. accept */
len = sizeof(struct sockaddr);
new_fd = accept(fd_socket, (struct sockaddr *)&AddrClient, &len);
if( new_fd == -1 )
{
perror("accept");
exit(0);
}
else /* listen监听到有连接,accept返回描述符 */
{
printf("Server: got connection from: %s,port: %d,socket: %d\n",
inet_ntoa(AddrClient.sin_addr),
ntohs(AddrClient.sin_port),new_fd);
}
while(1)
{
bzero(buf,sizeof(buf)+1);
len = recv(new_fd,buf,MAXBUF,0);// 阻塞等待接收数据
if(len == 0) // 0表示对方关闭了连结
{
close(new_fd);
printf("The Client Quit Connection!\n");
break;
}
else if(len < 0) // 异常
{
close(new_fd);
printf("recv failure ! errno code is: %d, errno message is '%s' \n",
errno,strerror(errno));
break;
}
else // 接收到数据
{
buf[len] = 0;
printf("%s\n",buf);
}
}
close(fd_socket);
return 0;
}
客户端连接服务器,连接成功后循环接收缓冲区数据,有数据输入,则读取发送给服务器端。
#include <stdio.h>
#include <string.h>
#include <strings.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <errno.h>
#define BUFFER_SIZE 1024
int main(int argc,char *argv[])
{
char buf[BUFFER_SIZE];
int res;
int fd_socket, len;
struct sockaddr_in AddrServer; // 目标服务器IP地址
if(argc != 3)
{
printf("Usage: %s <ip_addr> <port>\n",argv[0]);
exit(0);
}
/* 1. 创建一个socket */
fd_socket = socket(AF_INET, SOCK_STREAM, 0);
if(fd_socket < 0)
{
perror("Socket");
exit(errno);
}
/* 2. connect */
bzero(&AddrServer,sizeof(AddrServer));
AddrServer.sin_family = AF_INET; /* 地址协议 */
AddrServer.sin_addr.s_addr = inet_addr(argv[1]);
AddrServer.sin_port = htons( atoi(argv[2]) );
res = connect(fd_socket, (struct sockaddr *)&AddrServer, sizeof(AddrServer) );
if(res == -1)
{
perror("Connect");
exit(errno);
}
printf("Connect Server Success\n");
while(1)
{
printf("----#");
fgets(buf,BUFFER_SIZE-1,stdin); // 从终端读入数据
if( strncasecmp(buf,"quit",4) == 0 )
{
printf(" quit......!\n");
break;
}
len = send(fd_socket,buf,strlen(buf) - 1, 0);
if(len < 0)
{
perror("Send");
break;
}
}
close(fd_socket);
return 0;
}