Socket网络编程Linux下TCP Socket编程实例以及基础API

基础api介绍

网络字节序转换

unsigned long int htonl( unsigned long int hostlong);
unsigned short int htons( unsigned short int hostlong);
unsigned long int ntonl( unsigned long int hostlong);
unsigned short int ntonl( unsigned short int hostlong);

通用的Sokcet地址

#include <bit/socket.h>
struct sockaddr
{
    sa_family_t sa_family;
    char sa_data[14];
}

IP地址转换函数

#include <arpa/inet.h>
in_addr_t inet_addr( const char* strptr);
int inet_aton( const char* cp, struct in_addr* inp );
char* inet_ntoa( struct in_addr in);

socket

#include <sys/types.h>
#include <sys/socket.h>
/*
*参数:domain, type, protocol
*domain  :使用那种底层协议簇
*type    :指定服务类型
*protocol:选择何种协议
*/
int socket (int domain, int type, int protocol);

//将socket和指定的端口和IP绑定
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr* my_addr, socklen_t addrlen);

/*
*参数:sockfd, backlog
*sockfd     :指定被监听的socket
*backlog    :提示内核监听队列的长度
*/
#include <sys/socket.h>
int listen(int sockfd, int backlog );

//获取和接受远程连接的socket地址
#include <sys/types.h>
#include <sys/socket.h>
int accpet (int sockfd, struct sockaddr *addr, socklen_t *addrlen );

//主动与服务器建立连接
#include <sys/types.h>
#include <sys/socket.h>
int connect (int sockfd, const struct sockaddr *serv_addr, socklen_t *addrlen );

//关闭连接
#include <unistd.h>
int close (int fd );



/*
*功能         :关闭连接
*howto参数说明:
*SHUT_RD      :关闭socket读
*SHUT_WR      :关闭socket写
*SHUT_RDWR    :同时关闭读和写
*/
#include <sys/socket.h>
int showdown (int sockfd, int howto );

简易服务端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define MAXLINE 80
#define SERV_PORT 6666

int main(void)
{
	struct sockaddr_in servaddr, cliaddr;
	socklen_t cliaddr_len;
	int listenfd, connfd;
	char buf[MAXLINE];
	char str[INET_ADDRSTRLEN];
	int i, n;

    //创建socket
	listenfd = socket(AF_INET, SOCK_STREAM, 0);

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
	servaddr.sin_port = htons(SERV_PORT);
    
    //绑定socket
	bind(listenfd, (struct sockaddr *)&servaddr, sizeof(servaddr));
	
	//开始监听
	listen(listenfd, 20);

	printf("Accepting connections ...\n");
	while (1) {
		cliaddr_len = sizeof(cliaddr);
		
		//等待用户连接
		connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &cliaddr_len);
		n = read(connfd, buf, MAXLINE);
		printf("received from %s at PORT %d\n",
		inet_ntop(AF_INET, &cliaddr.sin_addr, str, sizeof(str)),
		ntohs(cliaddr.sin_port));
		for (i = 0; i < n; i++)
			buf[i] = toupper(buf[i]);
		write(connfd, buf, n);
		close(connfd);
	}
	return 0;
}

简易客户端

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>

#define MAXLINE 80
#define SERV_PORT 6666

int main(int argc, char *argv[])
{
	struct sockaddr_in servaddr;
	char buf[MAXLINE];
	int sockfd, n;
    char *str;

	if (argc != 2) {
		fputs("usage: ./client message\n", stderr);
		exit(1);
	}
    str = argv[1];

	sockfd = socket(AF_INET, SOCK_STREAM, 0);

	bzero(&servaddr, sizeof(servaddr));
	servaddr.sin_family = AF_INET;
	inet_pton(AF_INET, "127.0.0.1", &servaddr.sin_addr);
	servaddr.sin_port = htons(SERV_PORT);

	connect(sockfd, (struct sockaddr *)&servaddr, sizeof(servaddr));

	write(sockfd, str, strlen(str));

	n = read(sockfd, buf, MAXLINE);
	printf("Response from server:\n");
	write(STDOUT_FILENO, buf, n);
	close(sockfd);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值