前面一篇已经介绍了函数的使用方法,下面我写了一个小程序,来运用一下:
/*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