* 客户端程序 *
********************************/
#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>
int main(int argc,char *argv[])
{
int sockfd,numbytes;
char buf[100];
struct hostent *he;
struct sockaddr_in their_addr;
//从输入的命令行的第2个参数获取服务器的IP地址
he = gethostbyname(argv[1]);
//客户端建立TCP协议的socket套接字描述符
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
//客户端初始化结构体,连接到服务器的4321端口
their_addr.sin_family = AF_INET;
their_addr.sin_port = htons(4321);
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
bzero(&(their_addr.sin_zero),8);
//向服务器发起连接
if(connect(sockfd,(struct sockaddr *)&their_addr,sizeof(struct sockaddr_in))==-1)
{
perror("connect");
exit(1);
}
//向服务器发送字符串"hello!"
if(send(sockfd,"Hello! I am Client.",100,0)==-1)
{
perror("send");
exit(1);
}
//接收从服务器返回的信息
if(recv(sockfd,buf,100,0)==-1)
{
perror("recv");
exit(1);
}
printf("result: %s \n",buf);
/*通信结束*/
close(sockfd);
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
makefile:
EXTRA_LIBS += -lpthread
CC=gcc
EXEC = ./client
OBJS = client.o
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS)
install:
$(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
_____________________________________________________
/*******************************
* server.c *
********************************/
#include <sys/types.h>//socket
#include <sys/socket.h>//socket
#include <stdio.h>//printf
#include <stdlib.h>//exit
#include <errno.h>
#include <string.h>//bzero
//#include <unistd.h>
#include <netinet/in.h>//sockaddr_in
#define SERVER_PORT 4321
int main()
{
int sockfd,new_fd;
struct sockaddr_in my_addr;
struct sockaddr_in their_addr;
int sin_size;
char buff[100];
//服务器建立TCP协议的socket套接字描述符
if((sockfd = socket(AF_INET,SOCK_STREAM,0))==-1)
{
perror("socket");
exit(1);
}
printf("socket success!,sockfd=%d\n",sockfd);
//初始化sockaddr结构体,绑定4321端口
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(SERVER_PORT);
my_addr.sin_addr.s_addr = INADDR_ANY;
bzero(&(my_addr.sin_zero),8);
//绑定套接字描述符sockfd
if(bind(sockfd,(struct sockaddr *)&my_addr,sizeof(struct sockaddr_in))==-1)
{
perror("bind");
exit(1);
}
printf("bind success!\n");
//创建监听套接字描述符sockfd
if(listen(sockfd,10)==-1)
{
perror("listen");
exit(1);
}
printf("listening....\n");
//服务器阻塞监听套接字,等待客户端程序连接
while(1)
{
sin_size = sizeof(their_addr);
// 如果创建连接,将产生一个全新的套接字
if((new_fd = accept(sockfd,(struct sockaddr *)&their_addr,&sin_size))==-1)
{
perror("accept");
exit(1);
}
// bzero(buff, 100);
//生成一个子进程来完成和客户端的会话,父进程继续监听
if(!fork())
{
//读取客户端发来的信息
if(recv(new_fd,buff,100,0)==-1)
{
perror("recv");
exit(1);
}
printf(" %s\n",buff);
//发送信息到客户端
if(send(new_fd,"Welcome,This is Server.",50,0)==-1)
perror("send");
/*本次通信结束*/
close(new_fd);
exit(0);
}
/*下一个循环*/
}
close(sockfd);
}
/*
root@1[server]# ./server
server is run: Success
Hello! Client connect.
root@2[client]# .client 192.168.1.99
result: Welcome,This is Server.
*/
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
makefile:
EXTRA_LIBS += -lpthread
CC = arm-poky-linux-gnueabi-gcc
EXEC = ./server
OBJS = server.o
all: $(EXEC)
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(EXTRA_LIBS)
install:
$(EXP_INSTALL) $(EXEC) $(INSTALL_DIR)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
本文介绍了一个简单的TCP客户端与服务器程序实现,通过代码示例展示了如何建立连接、发送和接收数据。客户端通过指定IP地址连接服务器,并发送消息;服务器监听特定端口,接收并响应客户端请求。
4780

被折叠的 条评论
为什么被折叠?



