首页 > 代码库 > c实现windows socket

c实现windows socket

服务端代码:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/*   
 * testSocketService.c   
 *   
 *  Created on: 2012-8-16   
 *      Author: 皓月繁星   
 */
#include <WINSOCK2.H>
#include <stdio.h>  
                   
#define PORT           5150 
#define MSGSIZE        1024 
                  
#pragma comment(lib, "ws2_32.lib")   
                  
int main()   
{   
    WSADATA wsaData;   
    SOCKET sListen;   
    SOCKET sClient;   
    SOCKADDR_IN local;   
    SOCKADDR_IN client;   
    char szMessage[MSGSIZE];   
    int ret;   
    int iaddrSize = sizeof(SOCKADDR_IN);   
    WSAStartup(0x0202, &wsaData);   
                  
    sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);   
                  
    local.sin_family = AF_INET;   
    local.sin_port = htons(PORT);   
    local.sin_addr.s_addr = htonl(INADDR_ANY);   
    bind(sListen, (struct sockaddr *) &local, sizeof(SOCKADDR_IN));   
                  
    listen(sListen, 1);   
                  
    sClient = accept(sListen, (struct sockaddr *) &client, &iaddrSize);   
    printf("Accepted client:%s:%d\n", inet_ntoa(client.sin_addr),   
            ntohs(client.sin_port));   
                  
    while (TRUE) {   
        ret = recv(sClient, szMessage, MSGSIZE, 0);   
        szMessage[ret] = ‘\0‘;   
        printf("Received [%d bytes]: ‘%s‘\n", ret, szMessage);   
    }   
    return 0;   
  }

  

客户端代码

/*    
 * testSocketClient.c    
 *    
 *  Created on: 2012-8-16    
 *      Author: 皓月繁星    
 */
#include <WINSOCK2.H> 
#include <stdio.h>   
                  
//定义程序中使用的常量    
#define SERVER_ADDRESS "127.0.0.1" //服务器端IP地址    
#define PORT           5150         //服务器的端口号    
#define MSGSIZE        1024         //收发缓冲区的大小    
#pragma comment(lib, "ws2_32.lib")    
                 
int main()    
{    
    WSADATA wsaData;    
    //连接所用套节字    
    SOCKET sClient;    
    //保存远程服务器的地址信息    
    SOCKADDR_IN server;    
    //收发缓冲区    
    char szMessage[MSGSIZE];    
    //成功接收字节的个数    
    int ret;    
                 
    // Initialize Windows socket library    
    WSAStartup(0x0202, &wsaData);    
                 
    // 创建客户端套节字    
    sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); //AF_INET指明使用TCP/IP协议族;    
                                                         //SOCK_STREAM, IPPROTO_TCP具体指明使用TCP协议    
    // 指明远程服务器的地址信息(端口号、IP地址等)    
    memset(&server, 0, sizeof(SOCKADDR_IN)); //先将保存地址的server置为全0    
    server.sin_family = PF_INET; //声明地址格式是TCP/IP地址格式    
    server.sin_port = htons(PORT); //指明连接服务器的端口号,htons()用于 converts values between the host and network byte order    
    server.sin_addr.s_addr = inet_addr(SERVER_ADDRESS); //指明连接服务器的IP地址    
                                                        //结构SOCKADDR_IN的sin_addr字段用于保存IP地址,sin_addr字段也是一个结构体,sin_addr.s_addr用于最终保存IP地址    
                                                        //inet_addr()用于将 形如的"127.0.0.1"字符串转换为IP地址格式    
    //连到刚才指明的服务器上    
    connect(sClient, (struct sockaddr *) &server, sizeof(SOCKADDR_IN)); //连接后可以用sClient来使用这个连接    
                                                                        //server保存了远程服务器的地址信息    
    while (TRUE) {    
        printf("Send:");    
        //从键盘输入    
        gets(szMessage); //The gets() functionreads characters from stdin and loads them into szMessage    
        // 发送数据    
        send(sClient, szMessage, strlen(szMessage), 0); //sClient指明用哪个连接发送; szMessage指明待发送数据的保存地址 ;strlen(szMessage)指明数据长度    
    }    
                 
    // 释放连接和进行结束工作    
    closesocket(sClient);    
    WSACleanup();    
    return 0;    
}

 http://www.docin.com/p-111227070.html

Java mina和c++ ace做socket长连接 测试报告:

http://www.iteye.com/problems/44682

c++ RTMP server 做流媒体的

 流媒体研究博客:http://www.cnblogs.com/haibindev

http://www.rtmpd.com/

https://www.google.com.hk/#newwindow=1&q=rtmpc%2B%2B&safe=strict

 用HTTP方式:先通过IIS 将FLV下载到本地缓存,然后再通过NetConnection的本地连接来播放这个FLV,这种方法是播放本地的视频,并不是播放服务器的视频。因此在本地缓存里可以找到这个FLV。其优点就是服务器下载完这个FLV,服务器就没有消耗了,节省服务器消耗。其缺点就是FLV会缓存在客户端,对FLV的保密性不好。

用RTMP方式:通过NetConnection连接到FMS/Red5服务器,并实时播放服务器的FLV文件,这种方式可以任意选择视频播放点(SEEK()),并不象HTTP方式需要缓存完整个FLV文件到本地才可以任意选择播放点,其优点就是在本地缓存里是找不到这个FLV文件的。其优点就是FLV不会缓存在客户端,FLV的保密性好,其缺点就是消耗服务器资源,连接始终是实时的。

一句话,HTTP方式是本地播放,RTMP方式是服务器实时播放,因需而定。