程序演示了一个通过tcp/ip通讯的server/client程序,都是简单的C程序。源码:
server.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <errno.h>
#include<string.h>
int readline(int fd, void *pbuf, int maxlen);
int main(int argc,char **argv)
{
int fd,client_sockfd;
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)
{
printf("listen() error\n");
return -1;
}
//
// 等待
//
len = sizeof(remoteaddr);
printf("server recieve connect!--\n");
int i = 0;
while(1)
{
printf("\nWaiting for ...\n");
// fflush(stdout);
client_sockfd = accept(fd,(struct sockaddr *)&remoteaddr, &len);
//
// 接收数据
//
ret = recv(client_sockfd, (void *)buf, 1024, 0);
if(ret <= 0)
{
printf("server recieve data failed!--\n");
}
else
{
printf("server read line:%s\n", buf);
}
memset(buf,0x00,sizeof(buf));
// strcpy(buf,"How are you?");
sprintf(buf, "%d: How are you?", ++i);
sleep(3);
ret = send(client_sockfd, (void *)buf, strlen(buf),0);
if(ret <= 0)
{
printf("server send() error\n");
}
memset(buf,0x00,sizeof(buf));
//关闭联接
close(client_sockfd);
printf("close client\n");
}
return 0;
}
client.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fd;
int len,ret;
struct sockaddr_in remoteaddr;
char data[1024];
int times = 1;
//
// 建立套接口
//
fd = socket(AF_INET, SOCK_STREAM, 0);
//
// 连接
//
remoteaddr.sin_family = AF_INET;
remoteaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
remoteaddr.sin_port = htons(5000);
len = sizeof(remoteaddr);
ret = connect(fd, (struct sockaddr *)&remoteaddr, len);
if(ret == -1)
{
printf("connect() error\n");
return -1;
}
//while(1)
{
//发送数据
printf("The %d times run\n", times++);
sprintf(data,"%s","hello world");
ret = send(fd, (void *)data, strlen(data),0);
if(ret <= 0)
{
printf("send() error\n");
}
printf("sent line:%s\n", data);
bzero(data,1024);
sleep(1);
ret = recv(fd, (void *)data, 1024, 0);
if(ret <= 0)
{
printf("server recieve data failed!--\n");
}
else
{
int id = atoi(data);
printf("client[id=%d] read str:[%s]\n", id, data);
}
}
printf("client exited.\n");
//
// 关闭
//
finish:
close(fd);
fd = -1;
return 0;
}
再挂上我的Makefile:
install: myserver myclient
myserver: server.o
gcc -o myserver server.o
#server.o: server.c
myclient: client.o
gcc -o myclient client.o
#client.o: client.c
clean:
rm -f *.o my*
挂上我的这个makefile,主要是为了说明:
1. 我这个文件相互之间没有依赖性。
2. server.o依赖于server.c,所以这个依赖规则在makefile文件中可以不写,它默认已经存在的。