Linux C socket 封装

/**************************************************************************
 *                        Linux C socket 封装
 * 声明:
 *      同样的代码当然没必要敲很多遍了,一遍就够了,封起来,什么时候要用,
 *  什么时候就来这里拿。
 *
 *                                   2015-7-4 晴 深圳 南山平山村 曾剑锋
 *************************************************************************/

                    \\\\\\\\-*- 目录 -*-////////
                    |  一、cat zengjf_socket.h
                    |  二、cat zengjf_socket.c
                    \\\\\\\\\\\\\\//////////////

一、cat zengjf_socket.h
    #ifndef __ZENGJF_SOCKET_H__
        #define __ZENGJF_SOCKET_H__

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

        #define handle_error(msg) { perror(msg); exit(EXIT_FAILURE); }

        /**
         * 客户端socket
         * 参数说明:
         *      1.ip:服务器ip地址,点分十进制的ip字符串
         *      2.port:服务器端口号,字串的形式
         *      3.srvaddr:连接到服务器端的sockaddr_in
         */
        int socketClient(char* ip, char* port, struct sockaddr_in* srvaddr);
        /**
         * 服务器端socket
         * 参数说明:
         *      1.port:监听端口号,是字串的形式
         *      2.srvaddr:服务器的sockaddr_in
         *
         *
         *      服务器端socket默认能够同时监听30个连接
         */
        int socketServer(char* port, struct sockaddr_in* srvaddr);

    #endif // __ZENGJF_SOCKET_H__

二、cat zengjf_socket.c
    #include "zengjf_socket.h"

    int socketClient(char* ip, char* port, struct sockaddr_in* srvaddr){

        int sfd;

        // create a socket
        if ((sfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
            handle_error("can not create socketClient.");
        }

        // set the server socket address
        srvaddr->sin_family = AF_INET;
        srvaddr->sin_port = htons(atoi(port));
        inet_aton(ip, &(srvaddr->sin_addr));

        // connect
        if (connect(sfd, (struct sockaddr *)srvaddr, sizeof(struct sockaddr)) == -1){
            handle_error("can not connect to server.");
        }

        return sfd;
    }

    int socketServer(char* port, struct sockaddr_in* srvaddr){

        int srv_fd;
        //the default listen count
        int listenCount = 30;

        // create a socket
        if ((srv_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1){
            handle_error("can not create socketServer.");
        }

        //reuse the socket address
        int sockopt = 1;
        setsockopt(srv_fd, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt));

        // set the socket address
        srvaddr->sin_family = AF_INET;
        srvaddr->sin_port = htons(atoi(port));
        srvaddr->sin_addr.s_addr = htonl(INADDR_ANY);

        // bind the socket with the address
        if (bind(srv_fd, (struct sockaddr *)srvaddr, sizeof(struct sockaddr)) == -1){
            handle_error("can not bind the address.");
        }

        // listening
        // default was 30
        if (listen(srv_fd, listenCount) == -1){
            handle_error("can not listening to the port.");
        }

        return srv_fd;
    }
时间: 2024-08-28 12:55:47

Linux C socket 封装的相关文章

linux c socket programming

原文:linux c socket programming http://54min.com/post/http-client-examples-using-c.html 好文章 PPT http://www.slideshare.net/Arbow/asynchronous-io-programming verygood C: Linux Socket Programming, TCP, a simple HTTP client http://coding.debuntu.org/c-linu

ACE - 代码层次及Socket封装

原文出自http://www.cnblogs.com/binchen-china,禁止转载. ACE源码约10万行,是c++中非常大的一个网络编程代码库,包含了网络编程的边边角角.在实际使用时,并不是所有代码都能用到你的项目中来,相反你只需要其中的一小部分就已经可以完成实际所需. 最近研究其源码最大的感受就是代码量大,资料少,逻辑跳跃大.网上搜了下ACE方面的书籍和资料,也是皮毛上打滚,概念满天飞,侧重讲解如何使用其框架,复杂的底层代码和实现都避而不谈,不如直接看源码来的直接.ACE代码目录结构

探究python与linux的socket接口间的关系

1. 实验环境 Ubuntu 16.04LTS 2. 利用python的socket接口实现一个简单的聊天小程序 server端 import socket server = socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) server.bind(('127.0.0.1',8083)) server.listen(5) print

linux下把log4cxx封装成so动态库文件(一)

这是一个经常遇到的问题,在软件开发过程中,需要将某些功能封装成一个独立的模块,这样维护升级也很方便.现在我们就要把开源日志库log4cxx封装成so动态加载库文件. 在上一篇文章<log4cxx日志库RedHat下安装>中,我们已经将log4cxx安装在home/mac/log4cxx/log4cxx下了,那么接下来的操作我们就继续在这个路径下进行. 还是先tree一下/home/mac/log4cxx这个目录吧 log4cxx ---apr ---apr-util ---log4cxx 那再

linux网络socket 接口转

linux网络socket 接口 1.socket函数:一个进程必须做的第一件事就是调用socket函数获得一个文件描述符. ----------------------------------------------------------------- #include<sys/socket.h> int socket(int family,int type,int protocol); 返回:非负描述字---成功 -1---失败 -----------------------------

Linux下Socket编程

http://blog.chinaunix.net/uid-20733992-id-3450058.html 原文地址:Linux下Socket编程 作者:yulianliu1218 Linux下Socket编程 什么是Socket Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序.要学Internet上的TCP/IP网络编程,必须理解Socket接口. Socket接口设计者最先是将接口放在Unix操作系统里面

Linux下Socket编程的端口问题( Bind error: Address already in use )

Linux下Socket编程的端口问题( Bind error: Address already in use ) 在进行linux网络编程时,每次修改了源代码并再次编译运行时,常遇到下面的地使用错误: Bind error: Address already in use 虽然用Ctrl+C强制结束了进程,但错误依然存在,用netstat -an |grep 5120和ps aux |grep 5120都还能看到刚才用Ctrl+C“强制结束”了的进程,端口还是使用中,只好每次用kill结束进程,

Linux C Socket编程原理及简单实例

原文:http://www.cnblogs.com/xudong-bupt/archive/2013/12/29/3483059.html 部分转自:http://goodcandle.cnblogs.com/archive/2005/12/10/294652.aspx 1.   什么是TCP/IP.UDP? 2.   Socket在哪里呢? 3.   Socket是什么呢? 4.   有很多的框架,为什么还在从Socket开始? 5.   Linux C Socket简单示例 1.什么是TCP

Linux raw socket

Linux raw socket ========================================== 1. 为什么要详细了解raw socket呢? ?其实很早以前就对原始套接字有了一定的了解,那时候还做过一个小的抓包程序,当时以为对原始套接字很熟悉了,但是最近在看nmap的时候被其中的一句话给整迷糊了. ?在<Nmap Network Discovery III>的SYN scan章节中文中提到通过raw socket构造一个SYN包发给目标端口以后,如果目标端口发回了SY