c语言实现TCP的socket通信

简介: c语言实现TCP的socket通信
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>  
#include "NC_ComLib.h"
SOCKET m_sock;
int NetTimeout =8000 ;//网络超时时间
void Com_Hook_DebugOutHex( unsigned char *data, unsigned int datalen )
{
    unsigned int i=0;
    for(i =0; i < datalen; i++)
    {
        printf("%02x",data[i]);
    }
    printf("\r\n");
}
void Com_Hook_DebugOutAscii( unsigned char *data, unsigned int datalen )
{
    printf("%s\n",data);
}
int Connect( const char* address,int port)  
{  
    int rlt = 0;  
    int iErrMsg;  
    //初始化WinSock  
    WSADATA wsaData;  
    iErrMsg = WSAStartup(MAKEWORD(2,2),&wsaData);  
    if (iErrMsg != 0)  
    {  
        printf("failed with wsaStartup error : %d\n",iErrMsg);  
        rlt = 1;  
        return rlt; 
    }  
    m_sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);  
    if (m_sock == INVALID_SOCKET)  
    {  
        printf("socket failed with error : %d\n",WSAGetLastError());  
        rlt = 2;  
        return rlt;  
    }  
    //地址配置
    SOCKADDR_IN sockaddrServer;  
    sockaddrServer.sin_family = AF_INET;  
    sockaddrServer.sin_port = htons(port);  
    sockaddrServer.sin_addr.s_addr = inet_addr(address);  
    setsockopt(m_sock,SOL_SOCKET,SO_RCVTIMEO,(char*)&NetTimeout,sizeof(int));
    //建立连接 
    iErrMsg = connect(m_sock,(SOCKADDR*)&sockaddrServer,sizeof(sockaddrServer)); 
    if (iErrMsg < 0)  
    {  
        printf("connect failed with error : %d\n",iErrMsg);  
        rlt = 3;  
        return rlt;  
    }  
  return rlt;  
}
int SendMsg(const char* msg,int len)  
{  
    int rlt = 0;  
    int iErrMsg = 0;  
    iErrMsg = send(m_sock,msg,len,0);  
    if (iErrMsg < 0)  
    {  
        printf("send msg failed with error : %d\n",iErrMsg);  
        rlt = 1;  
        return rlt;  
    }  
    return rlt;  
}  
unsigned int Com_Dev_Connect( const char* address,int port, unsigned int timeout,unsigned int channel )
{
    return Connect(address,port);
}
unsigned int Com_Dev_TxData( unsigned char *buf, unsigned int len, unsigned int timeout, unsigned int channel )
{
    unsigned int rlt = 0;  
    int iErrMsg = 0;  
    iErrMsg = send(m_sock,(char*)buf,len,0);  
    if (iErrMsg < 0)  
    {  
        printf("send msg failed with error : %d\n",iErrMsg);  
        rlt = 1;  
        return rlt;  
    } 
    printf("->send:\r\n");
    Com_Hook_DebugOutAscii(buf,len);
    return rlt;  
}
unsigned int Com_Dev_RxData( unsigned char *buf, unsigned int *len, unsigned int bufsize, unsigned int timeout, unsigned int channel )
{
    unsigned int rcode = 0;
    int rval = 0; 
    unsigned char recvbuf[bufsize];
    rval = recv(m_sock,(char*)recvbuf,bufsize,0); 
    if(rval == SOCKET_ERROR)  
    {
        printf("recv socket error!\r\n"); 
        rcode = rval;
    }  
    else if (rval == 0)
    {
        //recv·µ»Ø0±íʾÕý³£Í˳ö  
        printf("ending connection!\r\n"); 
        rcode =200;
    }
    else 
    {
        //ÏÔʾ½ÓÊÕµ½µÄÊý¾Ý  
        printf("<-recv:\r\n");
        *len =  rval;
        memcpy(buf,recvbuf,*len);
        Com_Hook_DebugOutAscii(buf,*len);
        rcode =0;
    }
    return rcode;
}
unsigned int Com_Dev_Disconnect( unsigned int channel )
{
    closesocket(m_sock); 
    return 0; 
}


编译环境是windows下的GCC编译器 minGW


makefile 如下:


########################################
#makefile
########################################
BINARY= libmytcp
CC= gcc
LD= ld
CFLAGS= -std=c99
LDSCRIPT= -lws2_32
LDFLAGS= -Llib
OBJS= NC_ComLib.o
#CFLAGS=-std=c99
.PHONY: clean
all:images
images: $(BINARY).a
$(OBJS):%.o:%.c
$(CC) -c $(CFLAGS) $< -o $@
%.a: $(OBJS)
ar crv $(*).a $(OBJS)
clean:
rm -f *.o


相关文章
|
24天前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【10月更文挑战第10天】网络协议定义了机器间通信的标准格式,确保信息准确无损地传输。主要分为两种模型:OSI七层模型与TCP/IP模型。
|
1月前
|
网络协议 Linux 网络性能优化
Linux基础-socket详解、TCP/UDP
综上所述,Linux下的Socket编程是网络通信的重要组成部分,通过灵活运用TCP和UDP协议,开发者能够构建出满足不同需求的网络应用程序。掌握这些基础知识,是进行更复杂网络编程任务的基石。
91 1
|
2月前
|
网络协议 Linux 应用服务中间件
Socket通信之网络协议基本原理
【9月更文挑战第14天】网络协议是机器间交流的约定格式,确保信息准确传达。主要模型有OSI七层与TCP/IP模型,通过分层简化复杂网络环境。IP地址全局定位设备,MAC地址则在本地网络中定位。网络分层后,数据包层层封装,经由不同层次协议处理,最终通过Socket系统调用在应用层解析和响应。
|
2月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
2月前
|
网络协议 C语言
C语言 网络编程(十一)TCP通信创建流程---服务端
在服务器流程中,新增了绑定IP地址与端口号、建立监听队列及接受连接并创建新文件描述符等步骤。`bind`函数用于绑定IP地址与端口,`listen`函数建立监听队列并设置监听状态,`accept`函数则接受连接请求并创建新的文件描述符用于数据传输。套接字状态包括关闭(CLOSED)、同步发送(SYN-SENT)、同步接收(SYN-RECEIVE)和已建立连接(ESTABLISHED)。示例代码展示了TCP服务端程序如何初始化socket、绑定地址、监听连接请求以及接收和发送数据。
|
2月前
|
网络协议 C语言
C语言 网络编程(十四)并发的TCP服务端-以线程完成功能
这段代码实现了一个基于TCP协议的多线程服务器和客户端程序,服务器端通过为每个客户端创建独立的线程来处理并发请求,解决了粘包问题并支持不定长数据传输。服务器监听在IP地址`172.17.140.183`的`8080`端口上,接收客户端发来的数据,并将接收到的消息添加“-回传”后返回给客户端。客户端则可以循环输入并发送数据,同时接收服务器回传的信息。当输入“exit”时,客户端会结束与服务器的通信并关闭连接。
|
2月前
|
网络协议 C语言
C语言 网络编程(十二)TCP通信创建-粘包
TCP通信中的“粘包”现象指的是由于协议特性,发送方的数据包被拆分并在接收方按序组装,导致多个数据包粘连或单个数据包分割。为避免粘包,可采用定长数据包或先传送数据长度再传送数据的方式。示例代码展示了通过在发送前添加数据长度信息,并在接收时先读取长度后读取数据的具体实现方法。此方案适用于长度不固定的数据传输场景。
|
2月前
|
网络协议 C语言
C语言 网络编程(十)TCP通信创建流程---客户端
在TCP通信中,客户端需通过一系列步骤与服务器建立连接并进行数据传输。首先使用 `socket()` 函数创建一个流式套接字,然后通过 `connect()` 函数连接服务器。连接成功后,可以使用 `send()` 和 `recv()` 函数进行数据发送和接收。最后展示了一个完整的客户端示例代码,实现了与服务器的通信过程。
|
2月前
|
网络协议 数据处理 C语言
利用C语言基于poll实现TCP回声服务器的多路复用模型
此代码仅为示例,展示了如何基于 `poll`实现多路复用的TCP回声服务器的基本框架。在实际应用中,你可能需要对其进行扩展或修改,以满足具体的需求。
79 0
|
2月前
|
网络协议 Linux
TCP 和 UDP 的 Socket 调用
【9月更文挑战第6天】