/*************************************************************
* *
* tcp_server.c *
* *
**************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <string.h>
#include <unistd.h>
#define portnum 3333
int main(void)
{
int sockfd;
int new_fd;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
char buffer[128];
int nbyte;
int sin_size;
pid_t pid;
/* 1.创建套接字 */
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(sockfd == -1)
{
printf("create socket error !\n");
exit(1);
}
/* 2.1设定要绑定的地址 */
bzero(&server_addr,sizeof(struct sockaddr_in)); // 清零
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons((uint16_t)portnum);
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
/* 2.2绑定地址 */
if( bind(sockfd, (struct sockaddr *)&server_addr,sizeof(struct sockaddr)) == -1 )
{
printf("bin addr error !\n");
}
/* 3.监听端口 */
listen(sockfd, 5);
while(1)
{
sin_size = sizeof(struct sockaddr);
/* 4.等待连接 */
new_fd = accept(sockfd, (struct sockaddr *)&client_addr, (socklen_t *)&sin_size);
printf("server get connection from %s\n", inet_ntoa(client_addr.sin_addr));
/* 创建子进程 */
pid = fork();
if(pid == 0){
/* 5.接收数据 */
nbyte = recv(new_fd, (void *)buffer, 128, 0);
buffer[nbyte] = '\0';
printf("server received : %s\n", buffer);
/* 6.结束连接 */
close(new_fd);
close(sockfd);
exit(0);
}
else if(pid < 0)
{
printf("error !\n");
}
}
close(sockfd);
return 0;
}
/*************************************************************
* *
* tcp_clien.c *
* *
**************************************************************/
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <string.h>
#include <netinet/in.h>
#include <stdlib.h>
#define portnum 3333
int main()
{
int sockfd;
struct sockaddr_in server_addr;
char buffer[128];
/* 1.创建套接字 */
sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if(sockfd == -1)
{
printf("create socket error !\n");
exit(1);
}
/* 2.1 设置要链接的服务器的地址 */
bzero(&server_addr,sizeof(struct sockaddr_in)); // 清零
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons((uint16_t)portnum);
server_addr.sin_addr.s_addr = inet_addr("192.168.93.125");
/* 2.2 连接服务器 */
if(connect(sockfd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr)) == -1)
{
printf("connet error!\n");
exit(1);
}
/* 3. 发送数据 */
printf("Please input char : \n");
fgets(buffer,128,stdin);
send(sockfd,buffer,strlen(buffer),0);
/* 4. 关闭套接字 */
close(sockfd);
return 0;
}
特别提醒:关于tcp_client.c中的ip:192.168.93.125,因为我在同一台主机上面运行(该ip为我主机的ip),
所以就直接定死,如果需要在不同机子上运行可以通过传参数的方式。因为服务器地址只有一个,
所以两边的服务器地址设定方式就要一样。