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


相关文章
|
4天前
|
缓存 监控 Java
Java Socket编程最佳实践:优化客户端-服务器通信性能
【6月更文挑战第21天】Java Socket编程优化涉及识别性能瓶颈,如网络延迟和CPU计算。使用非阻塞I/O(NIO)和多路复用技术提升并发处理能力,减少线程上下文切换。缓存利用可减少I/O操作,异步I/O(AIO)进一步提高效率。持续监控系统性能是关键。通过实践这些策略,开发者能构建高效稳定的通信系统。
|
4天前
|
Java 应用服务中间件 开发者
【实战指南】Java Socket编程:构建高效的客户端-服务器通信
【6月更文挑战第21天】Java Socket编程用于构建客户端-服务器通信。`Socket`和`ServerSocket`类分别处理两端的连接。实战案例展示了一个简单的聊天应用,服务器监听端口,接收客户端连接,并使用多线程处理每个客户端消息。客户端连接服务器,发送并接收消息。了解这些基础,加上错误处理和优化,能帮你开始构建高效网络应用。
|
4天前
|
IDE Java 开发工具
从零开始学Java Socket编程:客户端与服务器通信实战
【6月更文挑战第21天】Java Socket编程教程带你从零开始构建简单的客户端-服务器通信。安装JDK后,在命令行分别运行`SimpleServer`和`SimpleClient`。服务器监听端口,接收并回显客户端消息;客户端连接服务器,发送“Hello, Server!”并显示服务器响应。这是网络通信基础,为更复杂的网络应用打下基础。开始你的Socket编程之旅吧!
|
4天前
|
Java 数据挖掘 开发者
Java网络编程进阶:Socket通信的高级特性与应用
【6月更文挑战第21天】Java Socket通信是分布式应用的基础,涉及高级特性如多路复用(Selector)和零拷贝,提升效率与响应速度。结合NIO和AIO,适用于高并发场景如游戏服务器和实时数据分析。示例展示了基于NIO的多路复用服务器实现。随着技术发展,WebSockets、HTTP/2、QUIC等新协议正变革网络通信,掌握Socket高级特性为应对未来挑战准备。
|
4天前
|
网络协议 安全 Java
Java网络编程入门涉及TCP/IP协议理解与Socket通信。
【6月更文挑战第21天】Java网络编程入门涉及TCP/IP协议理解与Socket通信。TCP/IP协议包括应用层、传输层、网络层和数据链路层。使用Java的`ServerSocket`和`Socket`类,服务器监听端口,接受客户端连接,而客户端连接指定服务器并交换数据。基础示例展示如何创建服务器和发送消息。进阶可涉及多线程、NIO和安全传输。学习这些基础知识能助你构建网络应用。
14 1
|
4天前
|
Java
Java Socket编程与多线程:提升客户端-服务器通信的并发性能
【6月更文挑战第21天】Java网络编程中,Socket结合多线程提升并发性能,服务器对每个客户端连接启动新线程处理,如示例所示,实现每个客户端的独立操作。多线程利用多核处理器能力,避免串行等待,提升响应速度。防止死锁需减少共享资源,统一锁定顺序,使用超时和重试策略。使用synchronized、ReentrantLock等维持数据一致性。多线程带来性能提升的同时,也伴随复杂性和挑战。
|
4天前
|
安全 Java 网络安全
Java Socket编程教程:构建安全可靠的客户端-服务器通信
【6月更文挑战第21天】构建安全的Java Socket通信涉及SSL/TLS加密、异常处理和重连策略。示例中,`SecureServer`使用SSLServerSocketFactory创建加密连接,而`ReliableClient`展示异常捕获与自动重连。理解安全意识,如防数据截获和中间人攻击,是首要步骤。通过良好的编程实践,确保网络应用在复杂环境中稳定且安全。
|
4天前
|
Java 数据安全/隐私保护
深入剖析:Java Socket编程原理及客户端-服务器通信机制
【6月更文挑战第21天】Java Socket编程用于构建网络通信,如在线聊天室。服务器通过`ServerSocket`监听,接收客户端`Socket`连接请求。客户端使用`Socket`连接服务器,双方通过`PrintWriter`和`BufferedReader`交换数据。案例展示了服务器如何处理每个新连接并广播消息,以及客户端如何发送和接收消息。此基础为理解更复杂的网络应用奠定了基础。
|
4天前
|
网络协议 Java Linux
探索Java Socket编程:实现跨平台客户端-服务器通信的奥秘
【6月更文挑战第21天】Java Socket编程示例展示了如何构建跨平台聊天应用。服务器端使用`ServerSocket`监听客户端连接,每个连接启动新线程处理。客户端连接服务器,发送并接收消息。Java的跨平台能力确保代码在不同操作系统上无需修改即可运行,简化开发与维护。
|
4天前
|
Java 测试技术 开发者
Java Socket编程实战案例:打造实时通信应用
【6月更文挑战第21天】Java Socket编程用于构建实时通信应用,如简易聊天系统。阻塞式Socket在读写时会阻塞线程,适合入门级应用。非阻塞式Socket(NIO)更高效,适用于高并发场景,允许线程在无数据时立即返回。通过对比两者,可理解实时通信技术的选择关键。示例代码展示了服务器端和客户端的实现。学习Socket编程能为应对未来挑战打下基础。