socket基本使用

UDP发送和接收
MainRecv.cpp

#include <iostream>
#include <WinSock2.h>
#include <sstream>

#pragma comment(lib,"ws2_32.lib")

#define RECV_IP "127.0.0.1"
#define RECV_PORT 8899
#define LEN_RECV_BUF 2048

int main()
{
    std::ostringstream ossTemp;
    WSAData wsaData;

    std::cout<<"Start..."<<std::endl;

    WSAStartup(MAKEWORD(2,2),&wsaData);
    SOCKET sktRecv=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);

    sockaddr_in addrRecv;
    addrRecv.sin_family=AF_INET;
    addrRecv.sin_addr.s_addr=inet_addr(RECV_IP);
         //htonl(INADDR_ANY);
    addrRecv.sin_port=htons(RECV_PORT);

    int retVal;

    retVal=bind(sktRecv,(sockaddr*)&addrRecv,sizeof(addrRecv));

    sockaddr_in addrClient;
    char buf[LEN_RECV_BUF];
    int len=sizeof(addrClient);
    while(true)
    {
        memset(buf,0,LEN_RECV_BUF);
        retVal=recvfrom(sktRecv,buf,LEN_RECV_BUF,0,(sockaddr*)&addrClient,&len);
        if(SOCKET_ERROR==retVal)
        {
            ossTemp<<"recvfrom error : "<<retVal<<"\n";
            OutputDebugString(ossTemp.str().c_str());
            break;
        }
        if(strlen(buf)>0)
            std::cout<<buf<<std::endl;
    }

    closesocket(sktRecv);
    WSACleanup();

    std::cout<<"Recv Over"<<std::endl;
    getchar();
    return -1;
}

MainSend.cpp

#include <iostream>
#include <sstream>
#include <WinSock2.h>

#define IP_SEND "127.0.0.1"
#define PORT_SEND 8899
#define LEN_SEND_BUF 1024

#pragma comment(lib,"ws2_32.lib")

int main()
{
    WSAData wsaData;
    WSAStartup(MAKEWORD(2,2),&wsaData);

    std::cout<<"Begin Sending..."<<std::endl;

    std::ostringstream ossTemp;
    SOCKET sktSend=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);
    sockaddr_in addrSend;
    addrSend.sin_family=AF_INET;
    addrSend.sin_addr.s_addr=inet_addr(IP_SEND);
    addrSend.sin_port=htons(PORT_SEND);
    int retVal;

    char buf[LEN_SEND_BUF];
    int len=sizeof(addrSend);
    int index=0;
    while(true)
    {
        if(index>255)
            break;
        ossTemp.str("");
        ossTemp<<index;
        memset(buf,0,LEN_SEND_BUF);
        memcpy(buf,ossTemp.str().c_str(),sizeof(int));
        retVal=sendto(sktSend,buf,LEN_SEND_BUF,0,(sockaddr*)&addrSend,len);
        if(SOCKET_ERROR==retVal)
        {
            ossTemp.str("");
            ossTemp<<"sendto error : "<<retVal;
            OutputDebugString( ossTemp.str().c_str() );
            break;
        }
        std::cout<<"Send : "<<buf<<std::endl;
        index++;
    }

    closesocket(sktSend);
    WSACleanup();

    std::cout<<"Send Over"<<std::endl;
    getchar();
    return 0;
}

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

linux下socket使用备忘:

先看文件列表:

Config.h...........................................

#define SERVER_IP "192.168.6.129"
#define SERVER_PORT 12345

Makefile

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>  //inet_addr需要引用
#include <string.h>  //memset方法需要引用
#include <unistd.h>  //close(sock_id)方法需要引用

#include "Config.h"

#define BUFSIZE 1024

int main(int argc,char* argv[])
{
int server_sockfd;
int client_sockfd;
int len;
struct sockaddr_in server_addr;
struct sockaddr_in client_addr;
int sin_size;
char buf[BUFSIZE];
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr("192.168.6.129");
//inet_pton(AF_INET,"192.168.6.129",&(server_addr.sin_addr));
server_addr.sin_port=htons(SERVER_PORT);

if( (server_sockfd=socket(AF_INET,SOCK_STREAM,0))<0 ){
perror("create sockets failed.");
return -1;
}

if( bind(server_sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr))<0 ){
perror("bind the socket failed.");
return -1;
}

listen(server_sockfd,5);

sin_size=sizeof(struct sockaddr_in);

if( (client_sockfd=accept(server_sockfd,(struct sockaddr*)&client_addr,(socklen_t*)&sin_size))<0 ){
perror("accept the connect failed.");
return -1;
}
printf( "accept client %s\n",inet_ntoa(client_addr.sin_addr) );
len=send(client_sockfd,"Welcome to my server\n",21,0);

while( (len=recv(client_sockfd,buf,BUFSIZE,0))>0 ){
buf[len]=‘\0‘;
printf("%s\n",buf);
if( send(client_sockfd,buf,len,0)<0 ){
perror("write failed.");
return -1;
}
}

close(client_sockfd);
close(server_sockfd);
return 0;
}

MySockTcpClient.cpp...........................................

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

#include "Config.h"

#define BUFSIZE 1024

int main(int argc,char* argv[])
{
int client_sockfd;
int len;
struct sockaddr_in server_addr;
char buf[BUFSIZE];
memset(&server_addr,0,sizeof(server_addr));
server_addr.sin_family=AF_INET;
server_addr.sin_addr.s_addr=inet_addr(SERVER_IP);
//inet_pton(AF_INET,SERVER_IP,&(server_addr.sin_addr));
server_addr.sin_port=htons(SERVER_PORT);

if( (client_sockfd=socket(PF_INET,SOCK_STREAM,0))<0 ){
perror("create the socket failed.");
return -1;
}

if( connect(client_sockfd,(struct sockaddr*)&server_addr,sizeof(struct sockaddr))<0 ){
perror("connect the server failed.");
}

printf("connected to server\n");
len=recv( client_sockfd,buf,BUFSIZE,0 );
buf[len]=‘\0‘;
printf("%s",buf);

while(1){
printf("Enter string to send:");
scanf("%s",buf);
if( !strcmp(buf,"quit") )
break;
len=send(client_sockfd,buf,strlen(buf),0);
len=recv(client_sockfd,buf,BUFSIZE,0);
buf[len]=‘\0‘;
printf("received:%s\n",buf);
}

close(client_sockfd);
return 0;

}

Makefile..................................................

CC=g++
CFLAGS=-I. -g

all:MySockTcpServer MySockTcpClient

MySockTcpServer:MySockTcpServer.o
  $(CC) -o MySockTcpServer MySockTcpServer.o -I.
MySockTcpClient:MySockTcpClient.o
  $(CC) -o MySockTcpClient MySockTcpClient.o -I.

clean:
  rm -f *.o MySockTcpClient MySockTcpServer

注意:

比较window,差别是:

1,头文件不同;

2,对socket的类型定义上有差别;

设置端口缓存大小:

//2. may set socket behavior 
int nErrCode;
unsigned int uiRcvBuf;
int uiRcvBufLen = sizeof(uiRcvBuf);
nErrCode= getsockopt(m_tcpClient, SOL_SOCKET, SO_RCVBUF, (char*)&uiRcvBuf, &uiRcvBufLen);
if(SOCKET_ERROR == nErrCode) return FALSE;
if(uiRcvBuf!=1024*8){
  //uiRcvBuf *= BUF_MULTIPLE;
  uiRcvBuf=1024*8;
  nErrCode = setsockopt(m_tcpClient, SOL_SOCKET, SO_RCVBUF,(char*)&uiRcvBuf, uiRcvBufLen);
if (SOCKET_ERROR == nErrCode) return FALSE;

nErrCode=getsockopt(m_tcpClient, SOL_SOCKET, SO_RCVBUF,(char*)&uiRcvBuf, &uiRcvBufLen);
if (SOCKET_ERROR == nErrCode) return FALSE;
if(uiRcvBuf!=1024*8) return FALSE;
}

时间: 2024-10-21 07:19:49

socket基本使用的相关文章

使用 IDEA 创建 Maven Web 项目 (异常)- Disconnected from the target VM, address: &#39;127.0.0.1:59770&#39;, transport: &#39;socket&#39;

运行环境: JDK 版本:1.8 Maven 版本:apache-maven-3.3.3 IDEA 版本:14 maven-jetty-plugin 配置: <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <configuration> <webAppSourceDirectory>${pro

iOS开发——网络编程OC篇&amp;Socket编程

Socket编程 一.网络各个协议:TCP/IP.SOCKET.HTTP等 网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 其中物理层.数据链路层和网络层通常被称作媒体层,是网络工程师所研究的对象: 传输层.会话层.表示层和应用层则被称作主机层,是用户所面向和关心的内容. http协议   对应于应用层 tcp协议    对应于传输层 ip协议     对应于网络层 三者本质上没有可比性.  何况HTTP协议是基于TCP连接的. TCP/IP是传输层协议,主要

winform学习日志(二十三)---------------socket(TCP)发送文件

一:由于在上一个随笔的基础之上拓展的所以直接上代码,客户端: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Net.Sockets; using Sys

程序媛计划——python socket通信

定义 socket 是进程间的一种通信方式,可以实现不同主机间的数据传输 #写服务期端程序server.py #实现服务器向客户端连接 1 #!/usr/bin/env python 2 #coding:utf-8 3 import socket 4 s= socket.socket() 5 #127.0.0.1是本地主机,1234是随意设置到一个端口号 6 s.bind(('127.0.0.1',1234)) #绑定端口号为1234 7 8 #等待客户端连接 9 s.listen(5) 10

Linux Socket编程-(转自吴秦(Tyler))

"一切皆Socket!" 话虽些许夸张,但是事实也是,现在的网络编程几乎都是用的socket. --有感于实际编程和开源项目研究. 我们深谙信息交流的价值,那网络中进程之间如何通信,如我们每天打开浏览器浏览网页时,浏览器的进程怎么与web服务器通信的?当你用QQ聊天时,QQ进程怎么与服务器或你好友所在的QQ进程通信?这些都得靠socket?那什么是socket?socket的类型有哪些?还有socket的基本函数,这些都是本文想介绍的.本文的主要内容如下: 1.网络中进程之间如何通信?

java socket编程中backlog的含义(zz)

使用Java.NET.ServerSocket能够方便的创建一个服务端套接字,这个类的构造函数有一个参数backlog.下面这段代码,在本机的8888端口上建立了一个套接字,backlog设置为5. [java] view plain copy // port:8888,backlog:5 ServerSocket server = new ServerSocket(8888, 5); 下面的Client是我们的测试类,会创建30个socket连接. [java] view plain copy

Python Socket 编程——聊天室演示样例程序

上一篇 我们学习了简单的 Python TCP Socket 编程,通过分别写服务端和client的代码了解主要的 Python Socket 编程模型.本文再通过一个样例来加强一下对 Socket 编程的理解. 聊天室程序需求 我们要实现的是简单的聊天室的样例,就是同意多个人同一时候一起聊天.每一个人发送的消息全部人都能接收到,类似于 QQ 群的功能,而不是点对点的 QQ 好友之间的聊天.例如以下图: 图来自:http://www.ibm.com/developerworks/linux/tu

【windows socket+UDPserverclient】

Windows Socket+UDPserverclient Winsock是 Windows下套接字标准.                    1.UDP socket编程:          UDP(用户数据报协议)是一个无连接.不可靠的传输数据,其特点是简单,快捷.相比与TCP,UDP不须要建立连接(不需connect.accept函数),数据发送接收之后,不须要终止连接.基于UDP的程序,避免了TCP执行的开销,在效率与速度上具有更好的表现.          UDP是无连接的,可能会

Unity3d 封装Socket创建简单网络

北京又在打雷下大雨了,学习Unity以来,越来越感兴趣,情不自禁的想要学习更多知识 这次自己搭建一个Socket模块,比较基础,适合新手学习,详细介绍Socket的搭建过程,同样会把详细过程在代码里进行注释~ 在搭建Socket过程中,需要创建以下几个常用的方法: 1.创建套接字(socket) 2.绑定Ip和端口 3.监听方法 4.接收客户端请求的方法 5.收发消息的方法 创建SocketManger管理类 把客户端与服务端代码都写在新建的SocketManger里,并把SocketMange

Java网络编程之tcp的socket通信

1.客户端MyClient.java 1 import java.io.*; 2 import java.net.*; 3 4 public class MyClient 5 { 6 public static void main(String[] args)throws Exception 7 { 8 Socket s = new Socket("192.168.1.1" , 30000); 9 // 客户端启动ClientThread线程不断读取来自服务器的数据 10 new Th