一 效果展示
持续互相通信,上面是服务端,下面为客户端加上ip,最后客户端输入exit退出
二 代码展示
服务端
/*server.c*/
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netinet/in.h>
#include <netdb.h>
#define portnumber 3333
int main(int argc ,char *argv[])
{
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
int nbytes;
int sockfd, new_fd;
char buffer[1024];
char sendbuf[1024];
/*建立socket连接*/
if ((sockfd = socket(AF_INET,SOCK_STREAM,0))== -1)
{
fprintf(stderr,"Socket error :%s\n\a",strerror(errno));
exit(1);
}
printf("socket id=%d",sockfd);
/*设置sockaddr_in 结构体中相关参数*/
bzero(&server_addr,sizeof(struct sockaddr_in));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
//server_addr.sin_addr.s_addr = inet_addr("192.168.1.1");
server_addr.sin_port = htons(portnumber);
/*绑定函数bind()*/
if (bind(sockfd, (struct sockaddr *) (&server_addr),
sizeof(struct sockaddr)) == -1)
{
fprintf(stderr,"Bind error :%s\n\a",strerror(errno));
exit(1);
}
printf("binding succeed!\n");
/*调用listen()函数,创建未处理请求的队列*/
if (listen(sockfd,5) == -1)
{
fprintf(stderr,"Listen error :%s\n\a",strerror(errno));
exit(1);
}
printf("Listening...\n");
/*调用accept()函数,等待客户端的连接*/
while(1)
{
memset(buffer,0x00,1024);
sin_size =sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd,
(struct sockaddr *)&client_addr, &sin_size)) == -1)
{
fprintf(stderr,"Accept error :%s\n\a",strerror(errno));
exit(1);
}
fprintf(stderr,"Server get connection from %d\n",inet_ntoa (client_addr.sin_addr));
if ((nbytes = read(new_fd, buffer,1024)) == -1)
{
fprintf(stderr,"Read error :%s\n\a",strerror(errno));
exit(1);
}
char content[1024];
if (strlen(buffer)>0)
{
buffer[nbytes] = '\0';
printf("Server received %s\n", buffer);
if(strncmp(buffer, "exit", 4)==0)
{
close(sockfd);
exit(0);
}
else
{
/*发送消息给服务器端*/
printf("Input to client: ");
fgets(content,1024,stdin);
send(new_fd,content,strlen(content),0);
}
}
close(new_fd);
}
exit(0);
}
客户端
/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#define portnumber 3333
int main(int argc, char *argv[])
{
int sockfd;
int recvbytes;
char buffer[1024];
char revbuf[1024];
struct hostent *host ;
struct sockaddr_in server_addr;
if(argc != 2)
{
fprintf(stderr,"Usage :%s hostname \a\n",argv[0]);
exit(1);
}
/*地址解析函数*/
if ((host = gethostbyname(argv[1])) == NULL)
{
fprintf(stderr,"Gethostbyname error\n");
exit(1);
}
while(1){
/*创建socket*/
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
fprintf(stderr,"Socket Error :%s\a\n",strerror(errno));
exit(1);
}
/*设置sockaddr_in 结构体中相关参数*/
bzero(&server_addr,sizeof(server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(portnumber);
server_addr.sin_addr = *((struct in_addr *)host->h_addr);
/*调用connect函数主动发起对服务器端的连接*/
if(connect(sockfd,(struct sockaddr *) (&server_addr),
sizeof(struct sockaddr))== -1)
{
fprintf(stderr,"Connect Error :%s\a\n",strerror(errno));
exit(1);
}
printf("Input to server: ");
/*发送消息给服务器端*/
fgets(buffer,1024,stdin);
//write(sockfd, buffer, strlen(buffer));
send(sockfd,buffer,strlen(buffer),0);
/*调用recv()函数接收客户端的请求*/
memset(revbuf, 0, sizeof(revbuf));
if ((recvbytes = recv(sockfd, revbuf, sizeof(revbuf), 0)) == -1)
{
perror("recv");
exit(1);
}
printf("Received a message: %s\n", revbuf);
close(recvbytes);
close(sockfd);
}
exit(0);
}