Linux下Socket编程简单demo示例

前面一篇已经介绍了函数的使用方法,下面我写了一个小程序,来运用一下:

/*commom.h*/
#ifndef _COMMOM_H_
#define _COMMOM_H_

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define SIZE 512

typedef struct
{
	int val;
	char buf[SIZE];
}Buffer;

int create_socket()
{
	int lisfd;
	lisfd = socket(AF_INET, SOCK_STREAM, 0);//IPV4 数据流 TCP类型
	if (lisfd == -1)
	{
		perror("create_socket failed!\n");
		exit(1);
	}
	return lisfd;
}

int sock_bind(int lisfd, int port)
{
	struct sockaddr_in myaddr;
	memset((char *)&myaddr, 0, sizeof(struct sockaddr_in));//清零
	myaddr.sin_family = AF_INET;//IPV4
	myaddr.sin_port = htons(port);//端口
	myaddr.sin_addr.s_addr = htonl(INADDR_ANY);//允许连接到所有本地地址上
	if (bind(lisfd, (struct sockaddr *)&myaddr, sizeof(struct sockaddr))==-1)
	{
		perror("sock_bind failed!\n");
		exit(1);
	}
	return 0;
}

int sock_listen(int lisfd, int max_con)
{
	if (listen(lisfd, max_con)==-1)
	{
		perror("sock_listen failed!\n");
		exit(1);
	}
	return 0;
}

int sock_accept(int lisfd)
{
	struct sockaddr remoaddr;
	int clifd;
	socklen_t size = sizeof(struct sockaddr);
	
	memset((char *)&remoaddr, 0, sizeof(struct sockaddr));
	clifd = accept(lisfd, &remoaddr, &size);
	if (clifd == -1)
	{
		perror("sock_accept failed!\n");
		exit(1);
	}
	return clifd;
}

int sock_connect(int clifd, char *ipaddr, int port)
{
	struct sockaddr_in remoaddr;
	memset((char *)&remoaddr, 0, sizeof(struct sockaddr_in));
	remoaddr.sin_family = AF_INET;//IPV4地址
	remoaddr.sin_port = htons(port);//端口
	remoaddr.sin_addr.s_addr = inet_addr(ipaddr);//服务器端IP地址
	if (connect(clifd, (struct sockaddr *)&remoaddr, sizeof(struct sockaddr))==-1)
	{
		perror("sock_connect failed!\n");
		exit(1);
	}
	return 0;
}

int sock_send(int sockfd, void *buf, size_t len, int flags)
{
	int nbytes;
	nbytes = send(sockfd, buf, len, flags);
	if (nbytes == -1)
	{
		perror("sock_send failed!\n");
		exit(1);
	}
	return nbytes;
}

int sock_recv(int sockfd, void *buf, size_t len, int flags)
{
	int nbytes;
	nbytes = recv(sockfd, buf, len, flags);
	if (nbytes == -1)
	{
		perror("sock_send failed!\n");
		exit(1);
	}
	return nbytes;
}


#endif

/*server.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "commom.h"

#define MAXNUM 10

int main(int argc, char **argv)
{
	if (argc != 2)
	{
		printf("Usage: %s <port>\n", argv[0]);
		exit(1);
	}
	int lisfd, clifd;
	Buffer *mybuf;
	mybuf = (Buffer *)malloc(sizeof(Buffer));
	
	lisfd = create_socket();
	sock_bind(lisfd, atoi(argv[1]));
	sock_listen(lisfd, MAXNUM);
	while(1)
	{
		clifd = sock_accept(lisfd);
		sock_recv(clifd, mybuf, sizeof(Buffer), 0);
		printf("recv:val = %d, buf = %s\n", mybuf->val, mybuf->buf);
	}
	close(clifd);
	close(lisfd);
	return 0;
}

/*client.c*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "commom.h"

int main(int argc, char **argv)
{
	if (argc != 3)
	{
		printf("Usage: %s <server_ipaddr> <port>\n", argv[0]);
		exit(1);
	}
	int clifd;
	Buffer *mybuf;
	mybuf = (Buffer *)malloc(sizeof(Buffer));
	
	clifd = create_socket();
	sock_connect(clifd, argv[1], atoi(argv[2]));
	printf("input a num:");
	scanf("%d", &mybuf->val);
	printf("input some text:");
	scanf("%s", mybuf->buf);
	sock_send(clifd, mybuf, sizeof(Buffer), 0);

	close(clifd);
	return 0;
}

#makefile
CFLAGS = -Wall -g
CC = gcc
TARGET1 = server
TARGET2 = client

all:$(TARGET1) $(TARGET2)
$(TARGET1):$(TARGET1).o
		$(CC) $(CFLAGS) -o $@ $^
$(TARGET2):$(TARGET2).o
		$(CC) $(CFLAGS) -o $@ $^
%.o:%.c %.h
		$(CC) -c $(CFLAGS) -o $@ $<
clean:
		rm -f $(TARGET1) $(TARGET2) *.o


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值