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

#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    listenfd, connfd;
    struct sockaddr_in     servaddr,caddr;
    char    buff[4096];
    int     n;

if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
    printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

memset(&servaddr, 0, sizeof(servaddr));
    memset(&caddr,0,sizeof(caddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(6666);

if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
    printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

if( listen(listenfd, 10) == -1){
    printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

printf("======waiting for client's request======\n");
    while(1){
socklen_t length = sizeof(caddr);
    if( (connfd = accept(listenfd, (struct sockaddr*)&caddr,&length)) == -1){
        printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
        continue;
    }
    n = recv(connfd, buff, MAXLINE, 0);
    buff[n] = '\0';
    printf("recv msg from client: %s\n",buff);
    printf("recv msg from %s:client: %s\n", inet_ntoa(caddr.sin_addr),buff);
    close(connfd);
    }

close(listenfd);
}

客户端:原文未动

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

#define MAXLINE 4096

int main(int argc, char** argv)
{
    int    sockfd, n;
    char    recvline[4096], sendline[4096];
    struct sockaddr_in    servaddr;

if( argc != 2){
    printf("usage: ./client <ipaddress>\n");
    exit(0);
    }

if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
    printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
    exit(0);
    }

memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(6666);
    if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
    printf("inet_pton error for %s\n",argv[1]);
    exit(0);
    }

if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
    printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
    exit(0);
    }

printf("send msg to server: \n");
    fgets(sendline, 4096, stdin);
    if( send(sockfd, sendline, strlen(sendline), 0) < 0)
    {
    printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
    exit(0);
    }

close(sockfd);
    exit(0);
}

======================================================================================

各个函数介绍:

socket,原型:

int socket(int domain, int type, int protocol);

选择协议域(ipv4 ipv6),socket类型(流 其他),协议(tcp udp)

通过该操作 得到一个文件描述符

将文件描述符和监听端口绑定

bing(int sockfd, const struct sockaddr *addr, socklen_t addrlen)

我们是是网络socket,所以要强转一下 ,两者区别:

struct sockaddr是通用的套接字地址,而struct sockaddr_in则是internet环境下套接字的地址形式

调用例子:

bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr))

绑定之后,便是listen,accept

int listen(int sockfd, int backlog);
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

listen定义监听的最大连接数

accept将服务器socket与客户端的网络信息结合在一起,返回后续通讯达客户端句柄

客户端,先调用socket,获取文件句柄,然后将服务器参数和句柄绑定int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);  然后就可以愉快通讯了。注意有个网络字节序和主机字节序

网络是大端~~

//======================================================================================================================

头文件
    windows下:
    #include <WS2tcpip.h>
    linux下:
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include<arpa/inet.h>
    inet_pton函数
    将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。
    第一个参数可以是AF_INET或AF_INET6:
    第二个参数是一个指向点分十进制串的指针:
    第三个参数是一个指向转换后的网络字节序的二进制值的指针。
    inet_ntop函数
    和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。
    第一个参数可以是AF_INET或AF_INET6:
    第二个参数是一个指向网络字节序的二进制值的指针;
    第三个参数是一个指向转换后的点分十进制串的指针;
    第四个参数是目标的大小,以免函数溢出其调用者的缓冲区。
    样例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main (void)
{
    char IPdotdec[20]; //存放点分十进制IP地址
    struct in_addr s; // IPv4地址结构体
    // 输入IP地址
    printf("Please input IP address: ");
    scanf("%s", IPdotdec);
    // 转换
    inet_pton(AF_INET, IPdotdec, (void *)&s);
    printf("inet_pton: 0x%x\n", s.s_addr); // 注意得到的字节序
    // 反转换
    inet_ntop(AF_INET, (void *)&s, IPdotdec, 16);
    printf("inet_ntop: %s\n", IPdotdec);
}

最新文章

  1. 设计模式之依赖倒转原则(DIP)
  2. bootstrap的编辑标记 angularjs input 弹出框
  3. BZOJ-1002 轮状病毒 高精度加减+Kirchhoff矩阵数定理+递推
  4. VS2013失去智能提示如何恢复
  5. Java 8 VM GC Tunning Guide Charter 7-8-b
  6. Java注解全面解析
  7. 键盘工具栏的快速集成--HcCustomKeyboard
  8. Reset Password Functionality FAQ
  9. selenium webdriver缺陷
  10. python web开发-flask中的url带斜线和不带斜线区别详解
  11. java.lang.UnsatisfiedLinkError: D:\Tomcat\apache-tomcat-7.0.67\bin\tcnative-1.dll:
  12. springMVC源码分析--异常处理机制HandlerExceptionResolver简单示例(一)
  13. 那些年Android开发中遇到的坑
  14. 一个xss漏洞到内网漫游【送多年心血打造的大礼包啦!】
  15. Effective C++(第三版)笔记 ---- 第一部分让自己习惯C++
  16. Spring Security Hello World Example--reference
  17. React icon bak
  18. UITextField禁用掉编辑之后...
  19. bzoj3946
  20. PHP依赖注入(DI)和控制反转(IoC)详解

热门文章

  1. RestTemplate java.net.UnknownHostException
  2. 深入理解zabbix(二)
  3. slect fd_set
  4. spring boot 项目的创建
  5. WebService发送 方法
  6. vue 绑定 class 和 内联样式(style)
  7. BZOJ 2005: [Noi2010]能量采集(容斥+数论)
  8. B/S 和 C/S 架构软件
  9. Openstack贡献者须知 — OpenPGP/SSH/CLA贡献者协议
  10. c#委托(Delegates)--基本概念及使用 转发