以前已经接触Windows下的Socket编程,最近也尝试着再linux下使用Socket编程,下面是在网上找的例子(已经测试过)
tcp_server.c:
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <time.h>
#define SERVER_PORT 20000
#define LENGTH_OF_LISTEN_QUEUE 10
#define BUFFER_SIZE 255
#define WELCOME_MESSAGE "welcome to connect the server"
int main(int argc, char **argv)
{
int servfd,clifd;
struct sockaddr_in servaddr,cliaddr;
if((servfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("create socket error!/n");
exit(1);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(SERVER_PORT);
servaddr.sin_addr.s_addr = htons(INADDR_ANY);
if(bind(servfd,(struct sockaddr*)&servaddr,sizeof(servaddr)) < 0)
{
printf ("bind to port %d failure!/n",SERVER_PORT);
exit(1);
}
if(listen(servfd, LENGTH_OF_LISTEN_QUEUE) < 0)
{
printf("call listen failure!/n");
exit(1);
}
while(1)
{
char buf[BUFFER_SIZE];
long timestamp;
socklen_t length = sizeof(cliaddr);
clifd = accept(servfd, (struct sockaddr*)&cliaddr, &length);
if(clifd < 0)
{
printf("error comes when call accept!/n");
break;
}
strcpy(buf,WELCOME_MESSAGE);
printf("from client, IP:%s, Port:%d/n", inet_ntoa(cliaddr.sin_addr), ntohs(cliaddr.sin_port));
timestamp = time(NULL);
strcat(buf, "timestamp in server:");
strcat(buf, ctime(×tamp));
send(clifd, buf, BUFFER_SIZE, 0);
close(clifd);
}
close(servfd);
return 0;
}
tcp_client.c:
#include <stdio.h>
#include <sys/socket.h>
#include <unistd.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <stdlib.h>
#define SERVER_PORT 20000
#define CLIENT_PORT ((20001 + rand())%65536)
#define BUFFER_SIZE 255
#define REUQEST_MESSAGE "welcome to connect the server./n"
void usage(char *name)
{
printf("usage:%s IpAddr/n", name);
}
int main(int argc, char **argv)
{
int servfd,clifd,length = 0;
struct sockaddr_in servaddr, cliaddr;
socklen_t socklen = sizeof(servaddr);
char buf[BUFFER_SIZE];
if(argc < 2)
{
usage(argv[0]);
exit(1);
}
if((clifd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
{
printf("create socket error!/n");
exit(1);
}
srand(time(NULL));
bzero(&cliaddr, sizeof(cliaddr));
cliaddr.sin_family = AF_INET;
cliaddr.sin_port = htons(CLIENT_PORT);
cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
inet_aton(argv[1], &servaddr.sin_addr);
servaddr.sin_port = htons(SERVER_PORT);
if(bind(clifd,(struct sockaddr*)&cliaddr, sizeof(cliaddr)) < 0)
{
printf("bind to port %d failure!/n", CLIENT_PORT);
exit(1);
}
if(connect(clifd, (struct sockaddr*)&servaddr,socklen) < 0)
{
printf("can't connect to %s!/n",argv[1]);
exit(1);
}
length = recv(clifd, buf, BUFFER_SIZE, 0);
if(length < 0)
{
printf("error comes when receive data from server %s!",argv[1]);
exit(1);
}
printf("from server %s:/n/t%s",argv[1], buf);
close(clifd);
return 0;
}
Makefile雏形:
CC =gcc
CFLAGS =
CPP =
#OBJS= tcp_client.o
#tcp_client:$(OBJS)
# $(CC) -o tcp_client $(OBJS)
tcp_server:tcp_server.o
$(CC) -o tcp_server tcp_server.o
%.o:%.c
$(CC) -c $<
clean:
rm -rf *.o